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图 谢谢!