定义
观察者模式的定义:定义对象之间一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并且被自动更新。
策略模式角色
一:抽象主题角色(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
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~