定义(百度百科):
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
UML类图:
具体代码:
abstract public class Subject { public List<Observer> list = new ArrayList<>(); void attach(Observer observer) { list.add(observer); } void detach(Observer observer) { list.remove(observer); } public abstract void notifyObserver(); } public class ConcreteSubject extends Subject { @Override public void notifyObserver() { for(Object obs:list) { ((Observer)obs).update(); } } } public interface Observer { void update(); } public class ConcreteObserver implements Observer { @Override public void update() { } }
模块说明:
Subject:目标对象,既被观察的对象,其中包含Observer的列表,当状态发生变化时,通知观察者。
ConcreteSubject:具体目标是目标类的子类,通常它包含有经常发生改变的数据,当它的状态发生改变时,向它的各个观察者发出通知。
Observer:观察者,对目标状态发生改变时,做出回应。
ConcreteObserver:它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致。
适用场景:
系统中一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制,个人觉得此种设计模式经典场景就是MQ,
无论是推消息模式还是拉消息的模式。
优缺点:
优点:
观察者和目标对象抽象耦合
实现了动态联动
实现了广播通信
缺点:
如果一个观察目标对象有很多直接和间接观察者,将所有的观察者都通知到会花费很多时间
观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化
总结:
触发联动