Java观察者模式总有你想不到的知识当一个对象改变状态时,所有依赖它的对象都会自动得到通知和更新。观察者模式的类图如下图所示:观察者模式有以下四种角色:角色描述抽象主题(Subject)角色该角色也称为“被观察者”,可以添加和删除观察者对象。抽象观察者(Observer)角色这个角色为所有特定的观察者定义了一个接口,并在被主题通知时更新自己。具体主体(ConcreteSubject)角色该角色也称为“具体观察者”,将相关状态存储在具体观察者对象中,并在具体主体内部状态发生变化时向所有注册的观察者发送通知。具体观察者(ConcreteObserver)角色该角色实现了抽象观察者所需要的更新接口,以协调自身状态与主体状态。代码示例:定义抽象主题(Subject)角色类包com.shixun.design.observer;/***抽象主题:Observed*/interfaceSubject{//注册一个新的观察者publicvoidattach(Observerobs);//删除一个注册的观察者publicvoiddetach(Observerobs);//通知所有注册的观察者对象publicvoidnotifyObserver();}定义抽象观察者(Observer)角色类包com.shixun.design.observer;/***抽象观察者:为所有具体的观察者定义一个接口*/interfaceObserver{//更新方法publicvoidupdate();}定义具体主体(ConcreteSubject)角色类包com.shixun。design.observer;importjava.util.Enumeration;importjava.util.Vector;/***具体主题:具体观察者*/classConcreteSubjectimplementsSubject{privateVectorobsVector=newVector();//注册一个新的观察者publicvoidattach(Observerobs){obsVector.add(obs);}//删除注册的观察者publicvoiddetach(Observerobs){obsVector.remove(obs);}//通知所有注册的观察者对象publicvoidnotifyObserver(){for(Observere:obsVector){e.更新();}}//返回观察者集合的枚举对象publicEnumerationobservers(){returnobsVector.elements();}//业务方法,改变状态publicvoidchange(){this.notifyObserver();}}定义ConcreteObserver角色类包com.shixun.design.observer;/***ConcreteObserver:实现抽象观察者需要的更新接口*/classConcreteObserverimplementsObserver{//实现更新方法publicvoidupdate(){System.out.println(this+"收到通知并处理!");}}定义测试类:packagecom.shixun.design.observer;导入com.shixun.design。strategy.ConcreteStrategy;importcom.shixun.design.strategy.Context;publicclassTest{publicstaticvoidmain(String[]args){ConcreteSubjectsubject=newConcreteSubject();ConcreteObserver观察者=newConcreteObserver();ConcreteObserverobserver1=newConcreteObserver();ConcreteObserverobserver2=newConcreteObserver();subject.attach(观察者);subject.attach(observer1);subject.attach(observer2);subject.change();}}运行结果如下:观察者模式有以下优点:观察者和被观察者是抽象耦合的,被观察者的作用是已知的是一组具体的观察者,每个观察者都符合抽象观察者的接口。被观察对象不认识任何特定的观察者,它只知道它们都有一个共同的接口。由于Observed和Observer没有紧密耦合,它们可以属于不同的抽象级别,并且都非常容易扩展。支持广播通信。被观察对象会向所有注册的观察者发送通知,这是一个触发机制,形成一个触发链。观察模式的缺点如下:如果一个主题有多个直接或间接的观察者,通知所有观察者会花费很多时间,开发调试也比较复杂。如果主体之间存在循环依赖,观察者就会触发它们之间的循环调用,导致系统崩溃。使用观察者模式时要特别注意这一点。如果通过另一个线程异步传递给观察者的通知,系统必须保证传递顺序。观察者模式虽然可以让观察者随时知道被观察对象发生了变化,但是观察者模式并没有提供相应的机制让观察者知道被观察对象发生了怎样的变化。应用场景观察者模式的应用场景如下:关联行为场景。事件多级触发场景。跨系统的消息交互场景,比如消息队列的处理机制。