观察者模式PPT

Download Report

Transcript 观察者模式PPT

观察者模式
主讲人:刘畅
小组成员:刘畅(组长)
付豪
江昊鸿
刘沛
崔铭
丁宵汉
目录
观察者模式介绍
观察者模式分析
代码实例
小测试
引子
还记得警匪片上,匪徒们是怎么配合实施犯罪的吗?一
个团伙在进行盗窃的时候,总 有一两个人在门口把风—
—如果有什么风吹草动,则会立即通知里面的同伙紧急撤
退。也许放风的人并不一定认识里面的每一个同伙;而在
里面也许有新来的小弟不认识这个放风的。但是这没什么,
这个影响不了他们之间的通讯,因为他们之间有早已商定
好的暗号。
定义
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。
GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当
一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自
动更新。
组成
抽象目标角色
(Subject)
观察者模式
抽象观察者角色
(Observer)
具体目标角色
(Concrete
Subject)
具体观察者角色
(Concrete
Observer)
目标角色往往由抽象类或者接口来实现。
为那些在目标发生改变时需要获得通知的对象定
义一个更新接口。
当它的状态发生改变时, 向它的各个观察者
发出通知。
实现Observer的更新接口以使自身状态与目标
的状态保持一致。
UML图
代码模型
代码模型
代码模型
推模型和
拉模型
在观察者模式中,又分为推模型和拉模型两种方式。
●
推模型
主题对象向观察者推送主题的详细信息,不管观
察者是否需要,推送的信息通常是主题对象的全部或部分
数据。
●
拉模型
主题对象在通知观察者的时候,只传递少量信息。
如果观察者需要更具体的信息,由观察者主动到主题对象
中获取,相当于是观察者从主题对象中拉数据。一般这种
模型的实现中,会把主题对象自身通过update()方法传递给
观察者,这样在观察者需要获取数据的时候,就可以通过
这个引用来获取了。
GOF给出了以下使用观察者模式的情况:
使用情况
1) 当一个抽象模型有两个方面, 其中一个方面依赖于另一
方面。将这二者封装在独立的对象中以使它们可以各自独
立地改变和复用。
。
2) 当对一个对象的改变需要同时改变其它对象, 而不知道
具体有多少对象有待改变。
3) 当一个对象必须通知其它对象,而它又不能假定其它对
象是谁。换言之, 你不希望这些对象是紧密耦合的
优缺点
优点
第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体
观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那
么这个对象必然跨越抽象化和具体化层次。
第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。
优缺点
缺点
第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
第二、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模
式是要特别注意这一点。
第三、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
第四、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道
所观察的对象是怎么发生变化的。
案例分析
实例描述
客户支付了订单款项,这时
财务需要开具发票,出纳需
要记账,配送员需要配货。
案例分析
案例分析
案例分析
案例分析
?
请用观测者模式实现一个汽车驾驶室仪表系统,当汽车改
变速度、改变方向时实时显示汽车的速
度、方向、指示灯等信息。
分析一下在汽车的仪表盘中会有哪些必要的内容
汽车是不是还有油
……
汽车行驶的速度
车往哪边转向
分析在该案例中的各成员所扮演的角色
观察者
Speedometer
被观察者
car
观察者
Turn signal lamp
观察者
Fuel Table
速度计(显示当前行驶速度)
转向指示灯(左右转向指示)
燃油表(显示当前剩余油量)
被观察者 car代码
观察者示例
speedometer代码
UML图
谢谢!