观察者模式(Observer Pattern).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
观察者模式(Observer Pattern)

描述: ????在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer?Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer),它们所依赖的对象称为主题(Subject)。为了实现观察者(Observer)的状态与主题(Subject)保持同步,观察者模式(Observer?Pattern) 推荐采用发布者--订阅者(publisher--subscriber)模型,以使这组观察者(Observer)和主题(Subject)对象之间有清晰的界限。 ????典型的观察者(Observer)是一个依赖于或者关注于主题对象的状态的对象。一个主题可以有一个或者多个观察者。这些观察者在主体的状态发生变化时,需要得到通知。 ????由于给定主体的观察者链表需要动态的变化,因此一个主题不能维护一个静态的观察者链表。因此关注于主题状态的任何对象都需要明确地注册自己为主体的一个观察者。主题状态发生的变化,都需要通知所有的以注册的观察者。从主题接到通知以后,每一个观察者查询主题,使自己的状态与主题的同步。因此一个主题扮演着发布者的角色,发布信息到所有的以订阅的观察者。 ????换句话说,主题和它的观察者之间包含了一对多的关系。当主题的实例的状态发生变化时,所有的依赖于它的观察者都会得到通知并更新自己。每一个观察者对象需要向主题注册,当主题的状态发生变化的时候得到通知。一个观察者可以注册或者订阅多个主题。当观察者不希望再得到通知时,它可以向主题进行注销。 ????为了实现这种机制: (1)????主题需要为注册和注销通知提供一个接口。 (2)????下面的两点也需要满足: A、????拉模型(In?the?pull?model)--主题需要提供一个接口,可以使观察者查询主题获得需要的状态信息来更新自己的状态。 B、????推模型(In?the?push?model)--主题发送观察者可能关注的状态信息。 (3)????观察者需要提供一个可以从主题接受通知的接口。 类图(图33.1)描述了为满足于以上需求,不同类的结构和它们之间的关联关系。 ?? Figure?33.1:?Generic?Class?Association?When?the?Observer?Pattern?Is?Applied? 从这个类图可以看到: (1)????所有的主题需要提供一个类似于Observable接口的实现。 (2)????所有的观察者需要提供一个类似于Observer接口的实现。 在应用观察者模式时,有几种变体。这就会产生不同类型的主题--观察者模式,例如, 观察者仅关注主体特定类型的变化等。 增加新的观察者: ????应用观察者模式以后,在不影响主题类的情况下,可以动态的加入不同的观察者。同样,主题的状态变化逻辑改变时,观察者也不会受到影响。 例子: ????为了管理一个卖厂多个分类产品,让我们建立一个销售报表系统。这个系统有以下特征: (1)????用户可以选择一个他们感兴趣的分类 (2)????在选择了一个分类以后,需要显示下面的两种类型的报表。 A、????月度报表(Monthly?report)--所选分类当月的所有交易清单。 B、????年度累积额(YTD?sales?chart)--以月为单位显示选择分类的年度累积额图。 (3)????当一个不同的分类被选择时,两种报表的数据会被刷新,显示当前所选分类的报表。 为了实现以上期望的功能,我们很容易的看到两个报表对象依赖于持有用户选择分类的对象。应用观察者模式于此场景,我们可以设计一个介于持有用户选择分类的对象和两个报表对象之间一个一致(同步)的交流模型。 让我们定义三个类,它们的功能如表33.1所描述: Table?33.1:?Subject-Observer?Classes? ? public?interface?Observable?{? ??public?void?notifyObservers();? ??public?void?register(Observer?obs);? ??public?void?unRegister(Observer?obs);? }? ?? Figure?33.2:?Observable?Interface?and?Its?Implementer? ReportManager类(Listing33.1)提供了声明在Observable接口中方法的实现。两个依赖于ReportManager的报表对象使用这些方法注册它们自己为观察者。ReportManager把这些注册的观察者保存到observersList矢量(vector)中。当前选择的

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档