3、观察者设计模式
1、观察者设计模式定义
观察者模式又叫发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
Subject类:抽象主题,把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreateSubject类:具体主题,将有关状态存入具体观察者对象;在具体主题的内部状态发生改变时,给所有登记过的观察者发出通知。
Observer类:抽象观察者,为所有的具体观察者定义一个接口,当得到主题的通知时更新自己。
ConcreateObserver类:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。
2、代码实现
a、subject抽象接口
1 interface Subject { 2 //添加观察者 3 public void add(Observer observer); 4 //移除观察者 5 public void remove(Observer observer); 6 //通知所有观察者 7 public void notifyObservers(); 8 }
b、Observer抽象接口
1 interface Observer { 2 public abstract void update();//更新方法 3 }
c、ConcreateSubject实现类
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class ConcreateSubject implements Subject{ 5 private String subjectState;//具体被观察者状态 6 private List<Observer> observers = new ArrayList<Observer>(); 7 public String getSubjectState() { 8 return subjectState; 9 } 10 11 public void setSubjectState(String subjectState) { 12 this.subjectState = subjectState; 13 } 14 15 @Override 16 public void add(Observer observer) { 17 observers.add(observer); 18 } 19 20 @Override 21 public void remove(Observer observer) { 22 observers.remove(observer); 23 24 } 25 26 @Override 27 public void notifyObservers() { 28 for(Observer o : observers){ 29 o.update(); 30 } 31 } 32 }
d、ConcreateObserver实现类
1 public class ConcreateObserver implements Observer { 2 private String name; 3 private String observerState; 4 private ConcreateSubject subject; 5 6 public ConcreateObserver(String name, ConcreateSubject subject) { 7 super(); 8 this.name = name; 9 this.subject = subject; 10 } 11 12 @Override 13 public void update() { 14 observerState = subject.getSubjectState(); 15 System.out.println("观察者" + name + "的新状态是" + observerState); 16 } 17 18 public ConcreateSubject getSubject() { 19 return subject; 20 } 21 22 public void setSubject(ConcreateSubject subject) { 23 this.subject = subject; 24 } 25 26 }
e、Main方法
1 public class Main { 2 public static void main(String[] args) { 3 ConcreateSubject s = new ConcreateSubject(); 4 s.add(new ConcreateObserver("tom", s)); 5 s.add(new ConcreateObserver("jack", s)); 6 s.add(new ConcreateObserver("fred", s)); 7 s.setSubjectState("live"); 8 s.notifyObservers(); 9 } 10 }
输出结果是
1 观察者tom的新状态是live 2 观察者jack的新状态是live 3 观察者fred的新状态是live
3、观察者模式 的特点
当一个对象的改变需要同时改变其他对象的时候,而且这个对象不知道具体有多少对象有待改变时,应该考虑使用观察者模式。通常被用来实现事件处理系统。