




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、河南理工大学程序设计模式结课论文2012 2013学年第2学期论文题目关于observer模式的学习学生姓名学 号专业班级 软件工程javalo-6班指导教师2013 年 7 月 3 日目录摘要11. observer(观察者模式)概述 22. observer(观察者模式)的定义 23. observer(观察者模式)的结构和使用 34. observer白勺优缺点45. 适合使用observer的情景56. observer在 java 中白勺应用 67. 综合应用举例88. 参考文献10摘要设计模式(design pattern)是针对有一类问题的最佳解决方案,解决了在 某种特定情景中重
2、复发生的某个问题。设计模式在程序设计中应用广泛,其遵循 一定的编程模式,使自己的代码便于理解,易于交流。一个好的设计系统往往是 易维护、易扩展、易复用的。设计模式的目的不是针对软件设计和开发中的每个问题都给出解决方案,而 是针对某种特定环境中通常都会遇到的某种软件开发问题给出的可重用的一些 解决方案,因此学习设计模式不仅可以使我们用好这些成功的模式,更重要的是 可以是我们更加深刻的理解而向对象的设计思想,有利于更好的地使用而向对彖 语言解决设计屮的问题。模式不使用理论推导出来的,而是从真实世界的软件系 统中被发现、按着一定规范总结出来的可以被复用的方案。在寻找新的模式之前, 必须先精通现有的模
3、式。通过研究学习现有的模式,可以比较容易地识别模式。面向对象程序设计中有很多种设计模式,大致可以分为三类:structural (结构型),behavioral (行为型),creational (创建型)。在课堂上,老师已 经讲过创建型模式和结构型模式所包含的共12种设计模式,本文所介绍的是 observer (观察者)设计模式,其属于behavioral模式。观察者模式(有吋又 被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象 管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这 通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理
4、 系统。本文主要介绍了 observer (观察者)设计模式相关理论性知识与实践应用, 通过对observer (观察者)设计模式的分析、理解、学习和掌握,以加深对java 中的接口或抽象类应用的理解。关键词:设计模式 面向对象observer (观察者)设计模式 理论与实践应用关于observer模式的学习1. observer (观察者模式)概述观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模 式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所 有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透 过呼叫各观察者所提供的方法来实现。
5、此种模式通常被用来实作事件处理系统。 观察者模式(observer)完美的将观察者和被观察的对彖分离开。举个例子,用 户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变 化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的 每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并 且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维 护性和重用性。实现观察者模式的吋候要注意,观察者和被观察对象之间的互动关系不能体 现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来, 从根本上违反面向对象的设计的原则。无论是
6、观察者“观察”观察对象,还是被 观察者将自己的改变“通知”观察者,都不应该直接调用。2. observer观察者模式)的定义根据gof所著design patterns中所述,observer模式可定义为:observer (观察者模式)的定义为:defines a one-to-many dependency between objects so that when one objeet changes state, all its dependents are notified and updated automatically.即定义对象间的一种一对多的依赖关系,当一个 对象的状态发生变
7、化时,多有依赖他的对象都得到通知并被自动更新。观察者:(observer)将自己注册到被观察对象(subject)中,被观察对象将观 察者存放在一个容器(container)里。被观察:被观察对象发生了某种变化(如图中的somcchangc),从容器中得到所 有注册过的观察者,将变化通知观察者。在此种模式中,一个冃标对彖管理所有相依于它的观察者对彖,并且在它本 身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。3. observer (观察者模式)的结构和使用观察者模式的组成部分:(1) 抽象目标角色(subject):目标角色知道它的观察者,可以有任意多个观察 者观察同一
8、个目标。并且提供注册和删除观察者对象的接口。此抽象类別提供一 个接口让观察者进行添附与解附作业。类别内有个不公开的观察者串炼,并透过 下列函式(方法)进行作业添附(attach):新增观察者到串炼内,以追踪目标对彖的变化。解附(detach):将已经存在的观察者从串炼中移除。通知(notify):利用观察者所提供的更新函式来通知此目标己经产牛变化。添附函式包涵了一个观察者对象参数。也许是观察者类别的虚拟函式(即更新函 式),或是在非面向对象的设定中所使用的函式指标(更广泛来讲,函式子或是函 式对彖)o(2) 抽象观察者角色(observer):该类别是一个必须被实做的抽象类别。这个类 别定义了
9、所有观察者都拥有的更新用接口,此接口是用来接收目标类別所发出的 更新通知。此类别含有以下函式更新(update):会被实做的一个抽象(虚拟)函式。(3) 具体目标角色(concrete subject):提供了观察者欲追踪的状态,并将有关 状态存入各个concrete observer对彖。利用其源类别(例如前述的抽彖fl标类 别)所提供的方法,来通知所有的观察者其状态已经更新。此类别拥有函式取得状 态(getstate):回传该目标对象的状态。(4) 具体观察者角色(concrete observer):存储有关状态,这些状态应与目标 的状态保持一致。这个类别含有指向目标类别的参考(refe
10、rence),以接收来自 目标类别的更新状态。实现observer的更新接口以使自身状态与fl标的状态保 持一致。在本角色内也可以维护一个指向concrete subject对象的引用。此类 别含有以下函式更新(update):是前述抽象函式的实做。当这个函式被目标对象 呼叫时,观察者对象将会呼叫目标对象的取得状态函式,来其所拥有的更新目标 对象资讯。每个观察者类别都要实做它自己的更新函式,以应对状态更新的情形。当冃 标对象改变时,会通过呼叫它自己的通知函式來将通知送给每一个观察者对象, 这个通知函式则会去呼叫已经添附在串炼内的观察者更新函式。通知与更新函式 可能会有一些参数,好指明是目前目标
11、对象内的何种改变。这么作将可增进观察 者的效率(只更新那些改变部份的状态)。观察者模式的uml类图结构:4. observer的优缺点observer模式的优点是实现了表示层和数据逻辑层的分离,并定义了稳定 的更新消息传递机制,类别清晰,并抽象了更新接口,使得可以有各种各样不同 的表示层(观察者)。但是其缺点是每个外观对象必须继承这个抽像出来的接口 类,这样就造成了一些不方便,比如有一个别人写的外观对象,并没有继承该抽 象类,或者接口不对,我们又希望不修改该类直接使用它。虽然可以再应用 adapter模式来一定程度上解决这个问题,但是会造成更加复杂烦琐的设计,增 加出错儿率。观察者模式的效果有
12、以下几个优点:(1)观察者模式在被观察者和观察者z间建立一个抽彖的耦合。被观察者角色 所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观 察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有 一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它 们可以属于不同的抽象化层次。(2) 观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。 观察者模式有下面的一些缺点:(1) 如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者 都通知到会花费很多时间。(2) 如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环 调用,导致系
13、统崩溃。在使用观察考模式时要特别注意这一点。(3) 如果对观察者的通知是通过另外的线程进行界步投递的话,系统必须保证 投递是以自恰的方式进行的。(4) 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观 察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。5.适合使用observer的情景课本中所介绍的适合使用observer的情景有两种,一种是当一个对象的数 据更新是需要通知其他对象,但这个对象又不希望和被通知的那些对象形成紧耦 合,即封装这些层面在单独的对象内将可允许程式设计师单独地去变更与重复使 用这些对象,而不会产生两者之间交互的问题。另一种是当一个对象的数据
14、更新 时,这个对彖需要让其他对彖也各自更行自己的数据,但这个对彖不知道具体有 多少个对象需要更新数据。除此之外,我还查找了一些其他适于应用该模式的情况,如:当对象应该有 能力通知其他对象,乂不应该知道其他对象的实做细节时,也可以用观察者模式。观察者模式通常与mvc范式有关系。在mvc中,观察者模式被用来降低 model与view的耦合程度。一般而言,model的改变会触发通知其他身为观 察者的model o而这些model实际上是view。java swing就是个范例,示 意了 model预期会透过propertychangenotification架构以送tb改变的通知 给其他view。m
15、odel类别是java bean类别的一员,并拥有与上述目标类别 同样的行为。view类别则系结了一些gui中的可视元素,并拥有与上述观察 者类别同样的行为。当应用程式在执行时。使用者将因view做岀相应的更新而 看见model所产生的变更。6. observer在java中的应用在java中通过observable类和observer接口实现了观察者模式oobserver 对象是观察者,observable对象是被观察者。实现观察者模式(1) 创建被观察者类,它继承自java. util. observable类;(2) 创建观察者类,它实现java. util. observer接口;(3
16、) 对于被观察者类,i > 添加它的观察者:void addobserver(observer o)addobserver()方法 把观察者对象添加到观察者对象列表中。ii、当被观察事件发生时,执行:setchanged():notifyobservers(): setchangeo方法用来设置一个内部标志位注明数据发生了变化; notifyobservers ()方法会去调用观察者对象列表屮所有的observer的 update()方法,通知它们数据发生了变化。只有在setchange()被调用后, notifyobservers ()才会去调用 update ()。对于观察者类,实现
17、observer接口的唯一方法update void update (observable o, object arg)形参 object arg,对应一个由 notifyobservers (object arg);传递来的参数, 当执行的是 notifyobservers();时,arg 为 nul 1。以下是电了商务实例中关于observer的应用:当下网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就“商 品的变化,以便及时通知订户”这一点,是很多网上商店共有的模式,这一模式 类似observer pattern观察者模式。具体的说,如果网上商店中商品在名称、价格等方面有
18、变化,如果系统能自动通 知会员,将是网上商店区别传统商店的一大特色。这就需要在商品product中加 入observer这样角色,以便product细节发生变化时,observer能自动观察到 这种变化,并能进行及时的update或not辻y动作。具体代码如下:/产甜类 可供jsp直接使用uscbcan调用该类,主要执行产品数据库插入、更 新publ ic class product extends observableprivate string name;private float price;public string getnameo return name;public void s
19、etname(string name) this. name=name;/设置变化点sctchangedo ;notifyobservers(name);!public float getprice() return price;public void setprice(float price)this. price=price;/设置变化点setchangedo ;notifyobservers (new float (price);i/以下可以是数据库更新插入命令.public void savetodb()我们注意到,在product类中的setxxx方法中,我们设置了 notify (
20、通知) 方法,当jsp表单调用setxxx,实际上就触发了 notisfyobservers方法,这将 通知相应观察者应该采取行动了。7. 综合应用举例该例子演示了:老师有电话号码,学生需要知道老师的电话号码以便于在合 时的时候拨打,在这样的组合中,老师就是一个被观察者(subject),学生就是 需要知道信息的观察者(obsewec,当老师的电话号码发生改变时,学生得到 通知,并更新相应的电话记录。/ subject 代码package observer;import java.util.observer;public interface subject public void attach
21、(observer o);public void detach(observer o);public void notice();/ observer 代码package observer;public in terface observer public void update);/ teacher 代码package observer;import java.util.vector;public class teacher implements subjectprivate string phone;private vector students;public teacher()phone
22、 =u"stude nts = new vector();public void attach(observer o)stude nts.add(o);public void detach(observer o)stude nts.remove(o);public void notice()for(int i=o;i<students.size();i+)(observer)stud en ts.get(i).updated;public void setphone(string phone)this.ph one = phone;no tice();public string
23、 getphone() return phone; overridepublic void attach(java.util.observer o) /todo auto-generated method stub overridepublic void detach(java.util.observer o) / todo auto-generated method stub/ student 代码package observer;import java.util.observable;import java.util.observer;public class student implem
24、ents observerprivate string name;private string phone;private teacher teacher;public student(string name,teacher t)this, name = n ame;teacher = t;public void show()system.out.printlnc'name:11+name+nleaches phone:h+this.getteacher().getphone();public void update()pho ne = this.getteacher().getpho
25、ne();(©overridepublic void update(observable o, object arg) / todo auto-generated method stub/client 代码package observer;import java.util.vector;public class clientpublic static void main(string args)vector students = new vector);teacher t = new teacher();forfint i= 0 ;i<10;i+)student st = ne
26、w student(h软件 lojavar+it);students.add(st);t.attach(st);t.setphone(quot;);for(int i=0;i<10;i«+)(stude nt)stude nts.get(i).show();t.setphone("quot;);forfint i=0;i<10;i+) (student)students.get(i).show();运行结果截图:nair.e :软件10匚己$己:0teacher phenenair.e :软件logva teacher吕 phonenair.e :软件lorva teach皂phon皂name :软件 10 jas teacherphonename:软件 lojava teacher's phonename:软件 10 java teacherphonename :软件lojavateachers phonenair.e :软件teacher's phonezaire :软件locvateacher phonenair.e :teacher's uhene0391-777777710391-777
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年统编版(2024)小学语文三年级上册第一单元测试卷及答案
- 管理咨询公司合同付款管理办法
- 防暴反恐知识技能培训课件
- 城市文旅融合发展探索
- 2025年最简单土石方运输合同3篇
- 2025年高考政治总复习文化生活模块全套知识清单
- 知识图谱辅助关系抽取方法-洞察及研究
- 四川省成都市2025-2026学年七年级语文上学期第一次月考复习试卷(含答案)
- 2025-2026学年湖南省长沙市名校联考联合体高二(上)第一次联考(暨入学模拟考试)物理试卷(含答案)
- 部门生产安全培训纪要课件
- 河北建投集团招聘笔试题库2025
- 2025年自建房施工合同书 (包工不包料 C款)
- (高清版)DB33∕T 715-2018 公路泡沫沥青冷再生路面设计与施工技术规范
- 军事心理战试题及答案
- 托育园管理制度
- 2025年北京市第一次普通高中学业水平合格性考试历史试题(含答案)
- 2025年江西省高职单招文化统一考试真题及答案(网络版)
- 检验科消防安全知识培训
- 中国古代数学家求数列和的方法课件-高二上学期数学人教A版选择性
- 铁塔拆除施工方案
- DB3714-T 0010-2022 园林绿化养护管理规范
评论
0/150
提交评论