java设计模式笔记

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

2019-02-21  本文已影响11人  朽木亦自雕

定义

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

策略模式角色

一:抽象主题角色(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)

上一篇 下一篇

猜你喜欢

热点阅读