观察者模式
定义
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
观察者模式UML图如下:
观察者模式中的角色
- Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
- ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
- Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
- ConcrereObserver:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
抽线观察者
- public interface Watcher
- {
- public void update();
- }
- public interface Watched
- {
- public void addWatcher(Watcher watcher);
- public void removeWatcher(Watcher watcher);
- public void notifyWatchers();
- }
- public class Security implements Watcher
- {
- @Override
- public void update()
- {
- System.out.println(“运输车有行动,保安贴身保护");
- }
- }
- public class Police implements Watcher
- {
- @Override
- public void update()
- {
- System.out.println(“运输车有行动,警察护航");
- }
- }
- public class Transporter 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();
- }
- }
- }
- public class Test
- {
- public static void main(String[] args)
- {
- Transporter transporter = new Transporter();
- Police police = new Police();
- Security security = new Security();
- Thief thief = new Thief();
- transporter.addWatcher(police);
- transporter.addWatcher(security);
- transporter.addWatcher(security);
- transporter.notifyWatchers();
- }
- }
- public class SimpleObservable extends Observable
- {
- private int data = 0;
- public int getData(){
- return data;
- }
- public void setData(int i){
- if(this.data != i) {
- this.data = i;
- setChanged();
- //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
- notifyObservers();
- }
- }
- }
- public class SimpleObserver implements Observer
- {
- public SimpleObserver(SimpleObservable simpleObservable){
- simpleObservable.addObserver(this );
- }
- public void update(Observable observable ,Object data){ // data为任意对象,用于传递参数
- System.out.println(“Data has changed to” + (SimpleObservable)observable.getData());
- }
- }