一 简介
查询者方式(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 收到信息,并进行处理
五 总结
长处
- 降低了政策与查询者之间的耦合联络,两者之间是抽象耦合联络
- 政策与查询者之间建立了一套触发机制
- 支撑广播通讯
- 符合“开闭准则”的要求
缺点
- 政策与查询者之间的依托联络并没有彻底免除,而且有或许出现循环引用
- 当查询者政策许多时,告知的发布会花费许多时间,影响程序的效率
运用场景
- 当一个政策情况的改动需求告知其他政策,或实际政策是事前不知道的或动态变化时,可运用查询者方式。
- 当运用中的一些政策有必要查询其他政策时,可运用该方式但仅能在有限时间内或特定情况下运用。