观察者模式
1.定义
定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖与它的对象都能得到通知并被自动更新。
2.示例代码
/*目标对象,它知道观察它的观察者,提供注册和删除观察者的接口*/ public class Subject{ /*用来保存注册的观察者对象*/ private List<Observer> observers = new ArrayList<Observer>(); /*注册观察者*/ public void attach(Observer observer){ observers.add(observer); } /*删除观察者*/ pubic void detach(Observer observer){ observers.remove(observer); } /*通知所有注册的观察者对象*/ protected void notifyObservers(){ for(Observer observer){ observer.update(this); } } } /*具体目标对象的定义*/ public class ConceteSubject extends Subject{ /*示意目标对象的状态*/ private String subjectState; public String getSubjectState(){ return subjectState; } public void setSubjectState(String subjectState){ this.subjectState = subjectState; //目标对象发生了改变,通知观察者 this.notifyObservers(); } }
/*观察者接口定义*/ public interface Observer{ /*更新的接口,同步目标对象状态*/ public void update(Subject subject); } /*具体观察者实现*/ public class ConcreteObserver implements Observer{ /*示意观察者的状态*/ private String observerState; public String getObserverState(){ return observerState; } public void update(Subject subject){ observerState = (ConcreteSubject)subject.getSubjectState(); } }
/*客户端调用示意*/ public class Client{ public static void main(String args[]){ //创建被观察者对象 ConcreteSubject subject = new ConcreteSubject (); //创建观察者对象 Observer observer1 = new ConcreteObserver(); Observer observer2 = new ConcreteObserver(); Observer observer3 = new ConcreteObserver(); //注册观察者 subject.attach(observer1); subject.attach(observer2); subject.attach(observer3); //改变被观察者状态 subject.setSubjectState("1"); //取得被观察者状态 System.out.println("observer1 = " + observer1.getObserverState()); System.out.println("observer2 = " + observer2.getObserverState()); System.out.println("observer3 = " + observer3.getObserverState()); } }
3.实际应用
观察者模式实现了观察者和目标对象之间的抽象耦合,实现了动态联动,支持广播通信。
观察者模式的本质:触发联动