




免费预览已结束,剩余8页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南理工大学程序设计模式结课论文2012 2013学年 第 2 学期论文题目 关于Observer模式的学习 学生姓名 李 想 学 号 311009060603 专业班级 软件工程Java10-6班 指导教师 霍占强 2013 年 7 月 3 日目录摘要11. Observer(观察者模式)概述22. Observer(观察者模式)的定义23. Observer(观察者模式)的结构和使用34. Observer的优缺点45. 适合使用Observer的情景56. Observer在Java中的应用67. 综合应用举例88参考文献10摘要摘要设计模式(Design Pattern)是针对有一类问题的最佳解决方案,解决了在某种特定情景中重复发生的某个问题。设计模式在程序设计中应用广泛,其遵循一定的编程模式,使自己的代码便于理解,易于交流。一个好的设计系统往往是易维护、易扩展、易复用的。设计模式的目的不是针对软件设计和开发中的每个问题都给出解决方案,而是针对某种特定环境中通常都会遇到的某种软件开发问题给出的可重用的一些解决方案,因此学习设计模式不仅可以使我们用好这些成功的模式,更重要的是可以是我们更加深刻的理解面向对象的设计思想,有利于更好的地使用面向对象语言解决设计中的问题。模式不使用理论推导出来的,而是从真实世界的软件系统中被发现、按着一定规范总结出来的可以被复用的方案。在寻找新的模式之前,必须先精通现有的模式。通过研究学习现有的模式,可以比较容易地识别模式。 面向对象程序设计中有很多种设计模式,大致可以分为三类:Structural(结构型),Behavioral(行为型),Creational(创建型)。在课堂上,老师已经讲过创建型模式和结构型模式所包含的共12种设计模式,本文所介绍的是Observer(观察者)设计模式,其属于Behavioral模式。观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。本文主要介绍了Observer(观察者)设计模式相关理论性知识与实践应用,通过对Observer(观察者)设计模式的分析、理解、学习和掌握,以加深对java中的接口或抽象类应用的理解。关键词:设计模式 面向对象 Observer(观察者)设计模式 理论与实践应用11关于Observer模式的学习关于Observer模式的学习1. Observer(观察者模式)概述观察者模式(有时又被称为发布-订阅模式、模型-视图模式、源-收听者模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。2. Observer(观察者模式)的定义根据GOF所著Design Patterns中所述,Observer模式可定义为:Observer(观察者模式)的定义为:Defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 即定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,多有依赖他的对象都得到通知并被自动更新。观察者:(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。被观察:被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。3. Observer(观察者模式)的结构和使用观察者模式的组成部分:(1)抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。此抽象类别提供一个接口让观察者进行添附与解附作业。类别内有个不公开的观察者串炼,并透过下列函式(方法)进行作业添附(Attach):新增观察者到串炼内,以追踪目标对象的变化。解附(Detach):将已经存在的观察者从串炼中移除。通知(Notify):利用观察者所提供的更新函式来通知此目标已经产生变化。添附函式包涵了一个观察者对象参数。也许是观察者类别的虚拟函式(即更新函式),或是在非面向对象的设定中所使用的函式指标(更广泛来讲,函式子或是函式对象)。(2)抽象观察者角色(Observer):该类别是一个必须被实做的抽象类别。这个类别定义了所有观察者都拥有的更新用接口,此接口是用来接收目标类别所发出的更新通知。此类别含有以下函式更新(Update):会被实做的一个抽象(虚拟)函式。(3)具体目标角色(Concrete Subject):提供了观察者欲追踪的状态,并将有关状态存入各个Concrete Observer对象。利用其源类别(例如前述的抽象目标类别)所提供的方法,来通知所有的观察者其状态已经更新。此类别拥有函式取得状态(GetState):回传该目标对象的状态。(4)具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。这个类别含有指向目标类别的参考(reference),以接收来自目标类别的更新状态。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。此类别含有以下函式更新(Update):是前述抽象函式的实做。当这个函式被目标对象呼叫时,观察者对象将会呼叫目标对象的取得状态函式,来其所拥有的更新目标对象资讯。每个观察者类别都要实做它自己的更新函式,以应对状态更新的情形。当目标对象改变时,会通过呼叫它自己的通知函式来将通知送给每一个观察者对象,这个通知函式则会去呼叫已经添附在串炼内的观察者更新函式。通知与更新函式可能会有一些参数,好指明是目前目标对象内的何种改变。这么作将可增进观察者的效率(只更新那些改变部份的状态)。观察者模式的UML类图结构:Subject+notify Observes()+add Observer()+delete Observer()ConcreteObserverB+notify()Concrete ObserverA+notify()Observer+notify()Concrete Subject A+notify Observes()Concrete Subject B+notify Observes()(ObserverCollection)notifyObservers() calls all object.notify()for(obs:observers) obs.update( );4. Observer的优缺点Observer模式的优点是实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口,使得可以有各种各样不同的表示层(观察者)。但是其缺点是每个外观对象必须继承这个抽像出来的接口类,这样就造成了一些不方便,比如有一个别人写的外观对象,并没有继承该抽象类,或者接口不对,我们又希望不修改该类直接使用它。虽然可以再应用Adapter模式来一定程度上解决这个问题,但是会造成更加复杂烦琐的设计,增加出错几率。观察者模式的效果有以下几个优点:(1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。(2)观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。观察者模式有下面的一些缺点:(1)如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。(2)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察考模式时要特别注意这一点。(3)如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。(4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。5. 适合使用Observer的情景 课本中所介绍的适合使用Observer的情景有两种,一种是当一个对象的数据更新是需要通知其他对象,但这个对象又不希望和被通知的那些对象形成紧耦合,即封装这些层面在单独的对象内将可允许程式设计师单独地去变更与重复使用这些对象,而不会产生两者之间交互的问题。另一种是当一个对象的数据更新时,这个对象需要让其他对象也各自更行自己的数据,但这个对象不知道具体有多少个对象需要更新数据。 除此之外,我还查找了一些其他适于应用该模式的情况,如:当对象应该有能力通知其他对象,又不应该知道其他对象的实做细节时,也可以用观察者模式。观察者模式通常与 MVC 范式有关系。在 MVC 中,观察者模式被用来降低 model 与 view 的耦合程度。一般而言, model 的改变会触发通知其他身为观察者的 model 。而这些 model 实际上是 view 。 Java Swing 就是个范例,示意了 model 预期会透过 PropertyChangeNotification 架构以送出改变的通知给其他 view 。 Model 类别是 Java bean 类别的一员,并拥有与上述目标类别同样的行为。 View 类别则系结了一些 GUI 中的可视元素,并拥有与上述观察者类别同样的行为。当应用程式在执行时。使用者将因 view 做出相应的更新而看见 model 所产生的变更。6. Observer在Java中的应用在Java中通过Observable类和Observer接口实现了观察者模式。Observer对象是观察者,Observable对象是被观察者。实现观察者模式(1)创建被观察者类,它继承自java.util.Observable类;(2)创建观察者类,它实现java.util.Observer接口;(3)对于被观察者类,、添加它的观察者:void addObserver(Observer o)addObserver()方法把观察者对象添加到观察者对象列表中。、当被观察事件发生时,执行:setChanged();notifyObservers();setChange()方法用来设置一个内部标志位注明数据发生了变化 ;notifyObservers()方法会去调用观察者对象列表中所有的 Observer的update()方法,通知它们数据发生了变化。只有在setChange()被调用后,notifyObservers()才会去调用 update()。(4)对于观察者类,实现Observer接口的唯一方法update void update(Observable o, Object arg)形参Object arg,对应一个由notifyObservers(Object arg); 传递来的参数,当执行的是notifyObservers();时,arg为null。以下是电子商务实例中关于Observer的应用:当下网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就“商品的变化,以便及时通知订户”这一点,是很多网上商店共有的模式,这一模式类似Observer pattern观察者模式。具体的说,如果网上商店中商品在名称、价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色。这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作。具体代码如下:/产品类 可供Jsp直接使用UseBean调用该类,主要执行产品数据库插入、更新public class product extends Observable private String name;private float price;public String getName() return name;public void setName(String name) =name;/设置变化点 setChanged(); notifyObservers(name);public float getPrice() return price;public void setPrice(float price) this.price=price;/设置变化点 setChanged(); notifyObservers(new Float(price); /以下可以是数据库更新 插入命令.public void saveToDb().我们注意到,在product类中的setXXX方法中,我们设置了 notify(通知)方法,当Jsp表单调用setXXX,实际上就触发了notisfyObservers方法,这将通知相应观察者应该采取行动了。7. 综合应用举例该例子演示了:老师有电话号码,学生需要知道老师的电话号码以便于在合时的时候拨打,在这样的组合中,老师就是一个被观察者(Subject),学生就是需要知道信息的观察者(Observer),当老师的电话号码发生改变时,学生得到通知,并更新相应的电话记录。/ Subject代码package observer;import java.util.Observer;public interface Subject public void attach(Observer o); public void detach(Observer o); public void notice();/ Observer代码package observer;public interface Observer public void update();/ Teacher代码package observer;import java.util.Vector;public class Teacher implements Subject private String phone; private Vector students; public Teacher() phone = ; students = new Vector(); public void attach(Observer o) students.add(o); public void detach(Observer o) students.remove(o); public void notice() for(int i=0;istudents.size();i+) (Observer)students.get(i).update(); public void setPhone(String phone) this.phone = phone; notice(); public String getPhone() return phone; Overridepublic void attach(java.util.Observer o) / TODO Auto-generated method stubOverridepublic 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 implements Observer private String name; private String phone; private Teacher teacher; public Student(String name,Teacher t) = name; teacher = t; public void show() System.out.println(Name:+name+nTeach
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络安全产品研发人员保密协议及技术保密义务
- 出租车企业股权转让与城市交通管理服务合同
- 《国有土地产权方与承租管理公司合作协议》
- 成都高端住宅项目代理销售服务合同
- 时尚商业街区场地租赁及品牌入驻管理合同
- 餐饮连锁品牌股权联营合同
- 爆破拆除工程安全生产责任保险合同
- ICU急救药物的应用
- 智能制造参股经营合同文本
- 仓库管理员职位聘用及保密协议
- YC/Z 623-2024烟草商业企业卷烟物流应急作业指南
- 物联网安全风险与防护
- 《T-CTS 7-2022 智能网联汽车道路测试与示范应用道路 交通事故信息采集技术规范》
- 包装产品设计部门规划
- 管道吹扫试压施工方案
- 热力站故障处理培训
- 2024年储能电站epc合同范本
- 正规防水补漏合同模板
- 中建EPC项目报批报建工作操作指引
- 2024年河北省高考地理试卷(含答案逐题解析)
- 《言语治疗技术》考试复习题库(附答案)
评论
0/150
提交评论