一 简介

查询者方式(observer pattern): 归于行为型规划方式。在政策之间定义一对多的依托, 这样一来, 当一个政策改动情况, 依托它的政策都会收到告知, 并自动更新。

二 目的

定义政策之间的一对多依托,当一个政策情况改动时,它的全部依托都会收到告知而且自动更新情况。

规划形式--观察者形式

三 结构

政策 (Subject)具有注册和移除查询者、并告知全部查询者的功用,主要是经过维护一张查询者列表来完成这些操作的。

查询者(Observer)的注册功用需求调用政策的 registerObserver()办法。

规划形式--观察者形式

Subject(政策):被查询者,它是指被查询的政策。

ConcreteSubject(具体政策):具体政策是政策类的子类,一般它包含经常发生改动的数据,当它的情况发生改动时,向它的各个查询者发出告知。一起它还完成了在政策类中定义的抽象事务逻辑办法(如果有的话)。

Observer(查询者):查询者将对查询政策的改动做出反响,查询者一般定义为接口,该接口声明了更新数据的办法 update(),因此又称为抽象查询者

ConcreteObserver(具体查询者):在具体查询者中维护一个指向具体政策政策的引用,它存储具体查询者的有关情况,这些情况需求和具体政策的情况保持一致;它完成了在抽象查询者 Observer 中定义的 update()办法。

四 代码完成

政策类:Subject

abstract class Subject {
  private Vector<Observer> obs = new Vector();
  public void addObserver(Observer obs){
    this.obs.add(obs);
  }
  public void delObserver(Observer obs){
    this.obs.remove(obs);
  }
  protected void notifyObserver(){
    for(Observer o: obs){
      o.update();
    }
  }
  public abstract void doSomething();
}

具体的政策类:ConcreteSubject

class ConcreteSubject extends Subject {
  public void doSomething(){
    System.out.println("被查询者事情发生改动");
    this.notifyObserver();
  }
}

查询者接口:Observer

interface Observer {
  public void update();
}

具体的查询者:ConcreteObserver1、2

class ConcreteObserver1 implements Observer {
  public void update() {
    System.out.println("查询者 1 收到信息,并进行处理");
  }
}
class ConcreteObserver2 implements Observer {
  public void update() {
    System.out.println("查询者 2 收到信息,并进行处理");
  }
}

客户类调用:

public class Client {
  public static void main(String[] args){
    Subject sub = new ConcreteSubject();
    sub.addObserver(new ConcreteObserver1()); //添加查询者 1
    sub.addObserver(new ConcreteObserver2()); //添加查询者 2
    sub.doSomething();
  }
}

输出:

被查询者事情发生改动
查询者 1 收到信息,并进行处理
查询者 2 收到信息,并进行处理

五 总结

长处

  • 降低了政策与查询者之间的耦合联络,两者之间是抽象耦合联络
  • 政策与查询者之间建立了一套触发机制
  • 支撑广播通讯
  • 符合“开闭准则”的要求

缺点

  • 政策与查询者之间的依托联络并没有彻底免除,而且有或许出现循环引用
  • 当查询者政策许多时,告知的发布会花费许多时间,影响程序的效率

运用场景

  • 当一个政策情况的改动需求告知其他政策,或实际政策是事前不知道的或动态变化时,可运用查询者方式。
  • 当运用中的一些政策有必要查询其他政策时,可运用该方式但仅能在有限时间内或特定情况下运用。