10-观察者模式
2023-09-30 19:33:22 0 举报
设计模式,观察者模式,设计模式UML类图,GOF23种设计模式
作者其他创作
大纲/内容
Observable
+ addObserver(Observer observer)+ deleteObserver(Observer observer)+ setChange()+ notifyObservers(Object arg)
ConcreteSubject1
+ subjectState
+ attach(Observer observer)+ detach(Observer observer)+ notify()
Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己
使用观察者模式的动机是什么?将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。而观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都可以得到通知。Subject发出通知时并不需要知道谁是它的观察者,而任何一个观察者也不需要知道其他观察者的存在。所以当一个对象的改变需要同时改变其他对象的时候应该是用观察者模式。而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。当一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
Subject
Boss
+ addObserver(Observer observer)+ deleteObserver(Observer observer)+ setChange()+ notifyObservers(Object arg)+ getAction():String+ setAction(String value)
Observer
+update()
ConcreteSubject类,具体主题,将有关联状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。
Java内置了观察者模式接口实现
StockObserver
Secretary
观察者模式(Observer)结构图
<<接口>>Observer
Subject类,它把所有观察者对象的引用保存在一个集合里。抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调
Java内置的Obserable是一个类,这样设计是有问题的。一个类,就只能继承它,但我们自己的类可能本身就需要继承其他抽象类,这就产生了麻烦。Java不支持多重继承,这就严重限制了Observable的复用潜力。编译时,会警告Observable已过时。系统其实不建议复用这样的方法。所以我们也要考虑怎么取舍,如何修改的问题。
0 条评论
下一页