纵有疾风起
人生不言弃

设计模式十九–观察者模式

定义

观察者模式的定义:定义对象之间一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并且被自动更新。

策略模式角色

一:抽象主题角色(Subject)
该角色又称为“被观察者”,可以增加和删除观察者对象。

public interface Subject{  //登记观察者    public void attach(Observer observer);  //删除观察者  public void detach(Observer observer);  //通知观察者  public void notifyObserver();}

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

public interface Observer{    public void update();}

三:具体主题(ConcreteSubject)
该角色又称为“具体被观察者”,它将有关状态存入具体被观察者对象,在具体的主题内部状态改变时,给所有登记过的观察者发出通知。

public class ConcreteSubject implements Subject{    private Vector<Observer> observers = new Vector<Observer>();    @Override    private void attach(Observer observer){      observers.add(observer);    }        @Override    public void detach(Observer observer){      observers.remove(observer);    }    @Override    public void notifyObserver(){        for(Observer observer : observers){          observer.update();        }    }    public Enumeration<Observer> observers(){       return observers.elements();    }    public void change(){      System.out.println("I am changed just now!");      this.notifyObserver();    }}

四:具体观察者角色(ConcreteObserver)
该角色实现抽象观察者所要求的更新接口,以便使自身的状态与主题的资源相协调。

public class ConcreteObserver implements Observer{  @Override  public void update(){    System.out.println("Yes, I received that !");  }}

调用示例代码

public class Test{  public static void main(String [] args){    Subject subject = new ConcreteSubject();    Observer observer = new Observer();    subject.attach(observer);    subject.change();  }}

优点

1:观察者和被观察者之间是抽象耦合,易于扩展。
2:支持广播通信。

缺点

1:一个主题有过个直接或者间接的观察者,则广播会比较耗费时间,开发调试复杂。
2:发生循环依赖容易引起死循环。
3:异步通知需要保证消息投递顺序。
4:观察者无法知道被观察者内部是如何变化的。

应用场景

1:关联行为场景。
2:事件多级触发场景。
3:跨系统的消息交换场景,如消息队列的处理机制。

参考文献:设计模式(java)

文章转载于:https://www.jianshu.com/p/1271b222c4b0

原著是一个有趣的人,若有侵权,请通知删除

未经允许不得转载:起风网 » 设计模式十九–观察者模式
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录