多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为
观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
【角色】
- 主题(Subject):被观察者,它是指被观察的对象。处理观察者的变化。当它的状态发生改变时,向它的各个观察者发出通知。
- 具体主题(ConcreteSubject):是一个实现主题接口的类,有一个用来存放观察者对象的容器。
- 观察者(Observer):根据主题中的更改而进行更新,观察者一般定义为接口,该接口声明了更新数据的方法 update(),因此又称为抽象观察者。
- 具体观察者(ConcreteObserver):具体观察者的实现类。
【优点】
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系,符合“开闭原则”的要求
【缺点】
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
/*** 观察者接口*/public interface Observer {void update(String message);}
/*** 观察者类*/public class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 收到了动态:" + message);}}
/*** 主题抽象类*/public interface Subject {/*** 添加观察者* @param observer*/void add(Observer observer);/*** 移除观察者* @param observer*/void remove(Observer observer);/*** 通知所有观察者* @param message*/void notify(String message);}
/*** 主题类*/public class ConcreteSubject implements Subject {private List<Observer> observerList = new ArrayList<>();/*** 添加观察者* @param observer*/@Overridepublic void add(Observer observer) {observerList.add(observer);}/*** 移除观察者* @param observer*/@Overridepublic void remove(Observer observer) {observerList.remove(observer);}/*** 通知所有观察者* @param message*/@Overridepublic void notify(String message) {for (Observer observer : observerList) {observer.update(message);}}}
```java public class ObserverTest { public static void main(String[] args) {
// 观察者Observer observer1 = new ConcreteObserver("张三");Observer observer2 = new ConcreteObserver("李四");Observer observer3 = new ConcreteObserver("王五");// 主题Subject subject = new ConcreteSubject();subject.add(observer1);subject.add(observer2);subject.add(observer3);subject.notify("第一条朋友圈");System.out.println();subject.remove(observer3);subject.notify("第二条朋友圈");
} } ——输出—— 张三 收到了动态:第一条朋友圈 李四 收到了动态:第一条朋友圈 王五 收到了动态:第一条朋友圈
张三 收到了动态:第二条朋友圈 李四 收到了动态:第二条朋友圈 ```
