欢迎来到天天文库
浏览记录
ID:33444253
大小:809.00 KB
页数:31页
时间:2019-02-24
《【5A版】观察者模型课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Observer<观察者>模式从生活中走进观察者模式在日常生活中,常常会有这样的情形:当某件事情发生时,就应该通知所有的相关者。例如,如果我们的课程改变了时间和地点,就应该通知所有选了这门课程的同学。在软件设计中,也有类似的问题:当一个对象的状态发生变化时,如何能够通知与其相关的所有其他对象,而不用修改该对象的代码?初析观察者模型在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化。例如:求职中心与求职者观察者模型的定义1、定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时
2、,所有依赖于它的对象都得到通知并被自动更新。2、别名:依赖(Dependents);发布-订阅(Publish-Subscribe)。ObserverPattern(AnotherName:Dependents,Publish-Subscribe)Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically.对概念的加深理解观察者模式中有一个“主题”对象和若干“
3、观察者”对象,主题和观察者之间是一对多的依赖关系。当主题的状态发生变化时,所有观察者都得到通知。例如:求职中心为主题,求职者为观察者观察者模型设计的动机1、将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象的一致性。我们不希望为了维持一致性使各类紧密耦合,因为这样降低了它们的可重用性。2、观察者模式使得任意数目的观察者不必知道彼此的存在,且主题发生变化时可以得到主题的通知,而同步改变状态。是一种很轻松的耦合。具有很好的可重用性。设计模型的原则1、将不变部分与固定比便的部分相离。对该原则的理解是:将变化的部分拿来进行封装,以便以
4、后你可以修改它而不会影响那些不变的部分。这一原则几乎是所有设计模式的基础,所有设计模式都提供一种机制:让系统的某些部分独立于其他部分而发生变化。2、对接口编程,而不是对实现编程实现观察者模式的过程:实现观察者模式有很多形式,比较直观的一种是“订阅------通知-----撤销订阅”的形式下。下面我们来详细的描述这一过程:观察者观察者(observer)将自己注册到被观察对象(subject)中,被观察对象(目标)将观察者存放在一个容器(container)里。3、被观察对象被观察对象发生了某些变化(如,发行方发行新的报纸),从容器中得到所有注册过
5、的观察者,将变化通知观察者4、撤销观察观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。(观察者将将自己注册到观察者容器时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息通知所有的观察者。基于接口,而不是具体的实现,这一点位程序提供了更大的灵活性。观察者模式的结构中的角色主题(Subject)观察者(Observer)具体主题(ConcreteSubject)具体观察者(
6、ConcreteObserver)观察者模式里角色的详细解析1、抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;抽象主题角色,有时又叫做抽象被观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也不排除使用具体类实现。2、抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;抽象观察者角色,可以用一个抽象类或者一个接口实现;在具体的情况下也
7、不排除使用具体类实现。3、具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;具体主题角色,通常用一个具体子类实现。4、具体观察者(ConcreteObserver)角色:保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。具体观察者角色,通常用一个具体子类实现。呵呵观察者模式类图举例说明模式的结构的描述与使用例:有一个大学毕业生和一个归
8、国留学者都希望能及时知道求职中心最新的职业需求信息。1.主题:Subject.javapublicinterfaceSubject{//
此文档下载收益归作者所有