设计模式十九--观察者模式
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)