本文共 2454 字,大约阅读时间需要 8 分钟。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
观察者模式的组成:
具体实现:
抽象主題角色:
public interface Watched { void addWatcher(Watcher watcher); void removeWatcher(Watcher watcher); void notifyWatchers(String string);}
抽象观察者角色:
public interface Watcher { void update(String string);}
具体主题角色:
public class ConcreteWatched implements Watched { private Listlist = new ArrayList<>(); @Override public void addWatcher(Watcher watcher) { list.add(watcher); } @Override public void removeWatcher(Watcher watcher) { list.remove(watcher); } @Override public void notifyWatchers(String str) { list.forEach(item -> item.update(str)); }}
具体观察者角色:
public class ConcreteWatcher implements Watcher { @Override public void update(String str) { System.out.println(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("hello world"); girl.removeWatcher(watcher2); girl.notifyWatchers("world"); }}
对于观察者模式,jdk内置实现了这种设计模式:
class HuiWatched extends Observable { void counter(int number) { for (;number>=0;number--) { this.setChanged(); this.notifyObservers(number); } }}class Watcher1 implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("Watcher1's count is: " + arg); }}class Watcher2 implements Observer { @Override public void update(Observable o, Object arg) { if ((Integer) arg <= 5) { System.out.println("Watcher2's count is : " + arg); } }}public class TwoObservers { public static void main(String[] args) { HuiWatched huiWatched = new HuiWatched(); Watcher1 watcher1 = new Watcher1(); Watcher2 watcher2 = new Watcher2(); huiWatched.addObserver(watcher1); huiWatched.addObserver(watcher2); huiWatched.counter(10); }}
具体的使用方法和上述的实现类似,这里需要注意的是jdk内置的实现多了一个对主题状态的修改,当有修改的时候状态会改变,当观察者被通知的时候状态会恢复。
转载地址:http://hmrgi.baihongyu.com/