已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OBSERVER(观察者),1,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。2.别名依赖(Dependents)发布-订阅(Publish-Subscribe),1.意图,2,将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了它们的可重用性。,3.动机,3,4,一个表格对象和一个柱状图对象可使用不同的表示形式描述同一个应用数据对象的信息。表格对象和柱状图对象互相并不知道对方的存在,这样使你可以根据需要单独复用表格或柱状图。但在这里是它们表现的似乎互相知道。当用户改变表格中的信息时,柱状图能立即反映这一变化,反过来也是如此。,5,这一行为意味着表格对象和棒状图对象都依赖于数据对象,因此数据对象的任何状态改变都应立即通知它们。同时也没有理由将依赖于该数据对象的对象的数目限定为两个,对相同的数据可以有任意数目的不同用户界面。,6,Observer模式描述了如何建立这种关系。这一模式中的关键对象是目标(subject)和观察者(observer)。一个目标可以有任意数目的依赖它的观察者。一旦目标的状态发生改变,所有的观察者都得到通知。作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。,7,一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作(Collaboration)。观察者模式是满足这一要求的各种设计方案中最重要的一种。,8,当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。,4.适用性,9,5.结构,10,Subject(目标)目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口。Observer(观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。ConcreteSubject(具体目标)将有关状态存入各ConcreteObserver对象。当它的状态发生改变时,向它的各个观察者发出通知。ConcreteObserver(具体观察者)维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。,6.参与者,11,当ConcreteSubject发生任何可能导致其观察者与其本身状态不一致的改变时,它将通知它的各个观察者。在得到一个具体目标的改变通知后,ConcreteObserver对象可向目标对象查询信息。ConcreteObserver使用这些信息以使它的状态与目标对象的状态一致。,7.协作,12,13,1)目标和观察者间的抽象耦合2)支持广播通信3)意外的更新,8.效果,14,1)创建目标到其观察者之间的映射2)观察多个目标3)谁触发更新a)由目标对象的状态设定操作在改变目标对象的状态后自动调用Notify。b)让客户负责在适当的时候调用Notify。4)对已删除目标的悬挂引用5)在发出通知前确保目标的状态自身是一致的,9.实现,15,6)避免特定于观察者的更新协议推/拉模型7)显式地指定感兴趣的改变8)封装复杂的更新语义ChangeManager有三个责任:a)它将一个目标映射到它的观察者并提供一个接口来维护这个映射。这就不需要由目标来维护对其观察者的引用,反之亦然。b)它定义一个特定的更新策略。c)根据一个目标的请求,它更新所有依赖于这个目标的观察者。9)结合目标类和观察者类,16,abstractclassSubject/FieldsprivateArrayListobservers=newArrayList();/MethodspublicvoidAttach(Observerobserver)observers.Add(observer);publicvoidDetach(Observerobserver)observers.Remove(observer);publicvoidNotify()foreach(Observeroinobservers)o.Update();,17,/ConcreteSubjectclassConcreteSubject:Subject/FieldsprivatestringsubjectState;/PropertiespublicstringSubjectStategetreturnsubjectState;setsubjectState=value;,18,/ObserverabstractclassObserver/MethodsabstractpublicvoidUpdate();,19,/ConcreteObserverclassConcreteObserver:Observer/Fieldsprivatestringname;privatestringobserverState;privateConcreteSubjectsubject;publicConcreteObserver(ConcreteSubjectsubject,stringname)this.subject=subject;=name;overridepublicvoidUpdate()observerState=subject.SubjectState;Console.WriteLine(Observer0snewstateis1“,name,observerState);publicConcreteSubjectSubjectgetreturnsubject;setsubject=value;,20,publicclassClientpublicstaticvoidMain(stringargs)/ConfigureObserverstructureConcreteSubjects=newConcreteSubject();s.Attach(newConcreteObse
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国烟草总公司浙江省公司人员招聘笔试备考题库及详细答案解析
- 2026年职业初中教育行业前景分析报告及未来五至十年创新驱动与生态构建
- 2026年中国石油云南销售分公司人员招聘笔试备考题库及详细答案解析
- 2026年陕西中烟工业有限责任公司人员招聘考试备考题库及详细答案解析
- 2026年国家能源集团甘肃公司人员招聘笔试参考试题及详细答案解析
- 2026年度山东省济宁市专业技术人员继续教育公需科目试卷及答案
- 2026年度全国安全生产活动月《安全知识》竞赛答题活动题库及答案
- 2026年度内蒙古包头市专业技术人员继续教育公需科目试卷及答案
- 高二化学盐类水解原理教学设计
- 九年级数学上册第25章一元二次方程复习教学设计
- 新疆维吾尔自治区初中级档案职称考试(档案基础)手机备考题库及答案(2026年)
- 肿瘤心理干预沟通护理课件
- 2026年校招:中国银行试题及答案
- 2026年物业管理条例考核试题及答案
- 公共娱乐场所电气消防安全培训
- 2026秋新版道德与法治五年级上册教学课件:第七课第1课时 社会主义好-自力更生结硕果 有多个微课视频
- 第5课 中国人民站起来了 第1课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 制造业公司绩效考核含全套KPI指标库
- 2026年《资料员》考试题库带答案(考试直接用)
- 水利水电工程基坑临边防护专项方案
- 2026年浙江省绍兴市越城区网格员招录真题(含答案)
评论
0/150
提交评论