观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
观察者模式组成:
抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类实现。
1 package observer; 2 3 public class ConcreteWatcher implements Watcher 4 { 5 @Override 6 public void update(String str) 7 { 8 System.out.println(str); 9 } 10 11 } 12 13 package observer; 14 15 import java.util.ArrayList; 16 import java.util.List; 17 18 public class ConcreteWatched implements Watched 19 { 20 private List<Watcher> list = new ArrayList<Watcher>(); 21 22 @Override 23 public void addWatcher(Watcher watcher) 24 { 25 list.add(watcher); 26 } 27 28 @Override 29 public void removeWatcher(Watcher watcher) 30 { 31 list.remove(watcher); 32 } 33 34 @Override 35 public void notifyWatchers(String str) 36 { 37 for(Watcher watcher : list) 38 { 39 watcher.update(str); 40 } 41 } 42 43 } 44 45 package observer; 46 47 public interface Watcher 48 { 49 public void update(String str); 50 } 51 52 package observer; 53 54 public interface Watched 55 { 56 public void addWatcher(Watcher watcher); 57 58 public void removeWatcher(Watcher watcher); 59 60 public void notifyWatchers(String str); 61 } 62 63 package observer; 64 65 public class Test 66 { 67 public static void main(String[] args) 68 { 69 Watched girl = new ConcreteWatched(); 70 71 Watcher watcher1 = new ConcreteWatcher(); 72 Watcher watcher2 = new ConcreteWatcher(); 73 Watcher watcher3 = new ConcreteWatcher(); 74 75 girl.addWatcher(watcher1); 76 girl.addWatcher(watcher2); 77 girl.addWatcher(watcher3); 78 79 girl.notifyWatchers("123"); 80 81 girl.removeWatcher(watcher2); 82 83 girl.notifyWatchers("456"); 84 85 86 } 87 }