设计模式 观察者模式(Observer)

设计模式 观察者模式(Observer)

@author ixenos

 

观察者模式是什么


观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听同一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。

观察者模式组成


抽象主题角色:把所有观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。

具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常由一个子类实现。

抽象观察角色:为所有具体的观察者定义一个更新接口,在得到主题的通知时更新自己。

具体观察角色:该角色实现抽象观察角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察角色可以保存一个指向具体主题角色的引用。通常由一个子类实现。

抽象观察角色:

1 public interface AbstractWatcher{
2     public void update();
3 }

具体观察角色

1 public class ConcreteWatcher implements AbstractWatcher{
2     @Override
3     public void update(){
4         System.out.println("Watcher update.");
5     }
6 }

抽象主题角色

1 public interface AbstractWatched{
2     public void addWatcher(AbstractWatcher watcher);
3     
4     public void removeWatcher(AbstractWatcher watcher);
5 
6     public void removeAllWatchers();
7 
8     public void changeStatus();
9 }

具体主题角色

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class ConcreteWatched implements AbstractWatched{
 5     private List<AbstractWatched> list = new ArrayList<>();
 6 
 7     @Override
 8     public void addWatcher(AbstractWatched watcher){
 9         list.add(watcher);
10     }
11 
12     @Override
13     public void removeWatcher(AbstractWatched watcher){
14         list.remove(watcher);
15     }
16 
17     @Override
18     public void removeAllWatchers(){
19         list.clear();
20     }
21 
22     @Override
23     public void changeStatus(){
24         System.out.println("Status changed");
25 
26         for(AbstractWatcher watcher : list){
27             watcher.update();
28         }
29     }
30 }

客户端

 1 public class Client{
 2     public static void main(String[] args){
 3 
 4         //定义一个主题角色
 5         AbstractWatched watched = new ConcreteWatched();
 6 
 7         //定义三个观察者角色
 8         AbstractWatcher watcher1 = new AbstractWatcher();
 9         AbstractWatcher watcher2 = new AbstractWatcher();
10         AbstractWatcher watcher3 = new AbstractWatcher();
11 
12         //添加观察者到主题当中
13         watched.addWatcher(watcher1);
14         watched.addWatcher(watcher2);
15         watched.addWatcher(watcher3);
16 
17         //主题角色改变,触发观察者改变
18         watched.changeStatus();
19 
20         watched.removeWatcher(watcher2);
21         watched.changeStatus();
22 
23         watched.removeAllWatchers();
24         watched.changeStatus();
25 
26     }
27 }
原文地址:https://www.cnblogs.com/ixenos/p/5813176.html