本文主要是介绍观察者模式简谈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
理解观察者模式
在日常生活中,当某件事发生时,应该通知所有相关者。例如,如果我们的课程改变时间或地点,就应该通知所有学习这门课程的同学。
在软件设计中,当一个对象的状态发生变化时,需要通知与其相关的其他所有对象,而且不用修改该对象代码。
图解观察者模式
包含的角色
Subject:主题
ConcreteSubject:具体主题
Observer:观察者
ConcreteObserver:具体观察者
优缺点
优点:
观察者和被观察者是抽象耦合的;
建立一套触发机制;
缺点:
如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间;
如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;
观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化;
目的
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
经典应用场景
拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
java的代码实现
public abstract class Subject {//定义一个观察者数组private Vector<Observer> obsVector = new Vector<Observer>();//增加一个观察者public void addObserver(Observer o){this.obsVector.add(o);}//删除一个观察者public void delObserver(Observer o){this.obsVector.remove(o);}//通知所有观察者public void notifyObservers(){for(Observer o:this.obsVector){o.update();}}
}
总结
使用场景一般满足的条件:
1)一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
2)一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
3)一个对象必须通知其他对象,而并不知道这些对象是谁。
4)需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
这篇关于观察者模式简谈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!