(一)观察者模式
观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
该模式有以下角色:
(1)抽象主题(Subject)角色:该角色提供了具体主题角色类实现的接口,定义了管理(添加、删除等)观察者对象的方法。
(2)具体主题(ConcreteSubject)角色:该角色保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;管理观察者对象的具体实现。
(3)抽象观察者(Observer)角色:该角色提供了具体观察者角色类实现的接口。
(4)具体观察者(ConcreteObserver)角色:该角色保存一个指向具体主题对象的引用和一个与主题的状态相符的状态,在得到通知时更新自己。
(二)java对观察者模式的支持:
java中提供了java.util.Observable类和java.util.Observer接口,让我们省略了抽象主题角色和抽象观察者角色的声明。
我们举个例子:Subject中的Email发生更改,即通知Observer1和Observer2两个观察者。
/*** 具体主题对象**/
public class ConcreteSubject extends Observable{private String name;private String email;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}//更改Email信息方法public void modifyEmail(String email){ this.email = email; //调用父类的方法,改变被观察者的状态 this.setChanged(); //通知客户名字发生改变this.notifyObservers(this); System.out.println("已通知观察者数:"+this.countObservers());}
}/*** 具体观察者对象1*/
public class ConcreteObserver1 implements Observer {//收到主题状态更新通知时更新自己public void update(Observable o, Object arg) {ConcreteSubject s = (ConcreteSubject)arg;System.out.println("Observer1收到通知:" + s.getName() + "信息发生变动:" + s.getEmail());}
}/*** 具体观察者对象2*/
public class ConcreteObserver2 implements Observer {//收到主题状态更新通知时更新自己public void update(Observable o, Object arg) {ConcreteSubject s = (ConcreteSubject)arg;System.out.println("Observer2收到通知:" + s.getName() + "信息发生变动:" + s.getEmail());}
}/*** 测试程序*/
public class Main {public static void main(String []args){Subject subject = new Subject();subject.setName("zhangsan");subject.setEmail("1234567@163.com");Observer1 observer1 = new Observer1();Observer2 observer2 = new Observer2();subject.addObserver(observer1);subject.addObserver(observer2);subject.modifyEmail("7654321@163.com");}
}
运行结果:
Observer2收到通知:zhangsan信息发生变动:7654321@163.com
Observer1收到通知:zhangsan信息发生变动:7654321@163.com
已通知观察者数:2
(三)优缺点
.....