观察者模式:
观察者模式定义了一种一对多的依赖关系,当一个对象改变状态时,它的所有依赖者都会受到通知,并自动更新。
注意: 观察者模式会造成内存泄漏,一定要记得取消订阅
UML关系图如下:
UML
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
- 观察者与主题之间依赖于接口,主题不需要知道观察者的具体实现
- 可以动态添加删除观察者,对主题没有任何影响
- 新增新类型的观察者对主题没有影响,主题的代码不需要修改,而且旧的观察者也不受影响
- 观察者与主题都可以独立复用,因为是松耦合
- 只要约定的接口不改变,修改主题或观察者任何一方,都不会影响另一方
代码实现
首先定义抽象的观察者:
- public interface Watcher {
- void update(String str);
- }
定义被观察者:
- public interface Watched{
- void addWatcher(Watcher watcher);
- void removeWatcher(Watcher watcher);
- void notifyWatchers(String str);
- }
定义具体的观察者
- public class ConcreteWatcher implements Watcher{
- @Override
- public void update(String str){
- System.out.println(str);
- }
- }
定义具体的被观察者:
- import java.util.ArrayList;
- import java.util.List;
- public class ConcreteWatched implements Watched{
- // 存放观察者
- private List<Watcher> list = new ArrayList<Watcher>();
- @Override
- public void addWatcher(Watcher watcher){
- list.add(watcher);
- }
- @Override
- public void removeWatcher(Watcher watcher) {
- list.remove(watcher);
- }
- @Override
- public void notifyWatchers(String str){
- // 自动调用实际上是主题进行调用的
- for (Watcher watcher : list){
- watcher.update(str);
- }
- }
- }
书写测试类:
- public class Test{
- public static void main(String[] args){
- Watched girl = new ConcreteWatched();
-
- Watcher watcher1 = new ConcreteWatcher();
- Watcher watcher2 = new ConcreteWatcher();
- Watcher watcher3 = new ConcreteWatcher();
-
- girl.addWatcher(watcher1);
- girl.addWatcher(watcher2);
- girl.addWatcher(watcher3);
-
- girl.notifyWatchers("开心");
- }
- }