观察者模式
- 格式:ppt
- 大小:2.11 MB
- 文档页数:39
观察者模式的例子
观察者模式的例子
观察者模式是一个十分常见的设计模式,它可以帮助我们从被观察的
对象中获取信息,并在需要时自动通知我们。
本篇文章将通过几个具
体的例子来介绍观察者模式。
一、新闻订阅
假设我们有一个新闻网站,用户可以选择订阅自己感兴趣的新闻主题,如政治、体育、娱乐等。
当我们有新的相关新闻时,应该如何通知已
订阅该主题的用户呢?这时观察者模式就可以充分发挥作用。
我们可
以把网站的用户看作观察者,而每个订阅主题可以看作一个被观察者,当被观察者发生变化时(如新闻更新),通知所有观察者即可。
二、股票市场
另一个例子是股票市场,投资者需要及时了解股票的价格变化。
我们
可以把每只股票看作一个被观察者,而每个投资者可以看作观察者。
当股票价格发生变化时,被观察者可以通过观察者模式通知所有观察者,投资者们就可以第一时间了解到相关信息。
三、自定义通知
观察者模式还可以用于自定义通知,例如某个人可以设置自己的日程
安排,并让自己的亲属和朋友作为观察者,当日程安排发生变化时,
观察者将自动收到通知,以便及时作出应对。
总结
观察者模式可以用于任何需要监控变化的场景,它将被观察者和观察
者解耦,使得系统更加灵活和可扩展。
在实际应用中,我们需要关注
以下几点:
1. 确定被观察者和观察者之间的关系,并定义相应的接口;
2. 当被观察者状态发生变化时,通知所有观察者;
3. 观察者根据通知的内容作出相应的处理。
观察者模式虽然简单,但是在系统的设计和开发中发挥着重要的作用。
希望读者们能够多加关注和实践!。
观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够得到通知并自动更新。
观察者模式包含以下几个主要特点:1. 主题(Subject)和观察者(Observer):- 观察者模式包含两个主要角色,即主题和观察者。
主题是被观察的对象,它维护了一组观察者,并提供了添加、删除和通知观察者的方法。
观察者则是依赖于主题的对象,当主题状态发生改变时,观察者得到通知并进行相应的更新。
2. 松散耦合:- 观察者模式实现了松散耦合,使得主题和观察者之间的关系不是静态的硬编码关系,而是动态的。
主题无需知道观察者的具体类,只需知道它们实现了共同的接口。
3. 支持广播通信:- 主题状态发生改变时,会向所有注册的观察者发送通知,实现了一对多的通信机制。
这样,可以方便地广播信息给所有关注主题状态变化的观察者。
4. 观察者可以动态加入和退出:- 在运行时,可以动态地添加新的观察者或删除不再关心主题状态的观察者,而不需要修改主题的代码。
这使得系统更加灵活。
5. 遵循开闭原则:- 观察者模式遵循开闭原则,即对扩展开放,对修改关闭。
通过添加新的观察者,而不是修改现有的代码,可以轻松地扩展系统功能。
6. 注意观察者的通知顺序:- 观察者收到通知的顺序可能是随机的,具体取决于主题的实现。
如果观察者之间有依赖关系,需要注意通知的顺序可能对系统产生影响。
7. 可能导致性能问题:- 如果观察者的数量较多或者通知过于频繁,可能导致性能问题。
在实现时需要注意考虑性能优化。
观察者模式常用于实现分布式事件处理系统、GUI系统中的事件处理等场景,它提供了一种松散耦合的设计,使得对象之间的关系更加灵活和可扩展。
1意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2别名依赖(Dependents), 发布-订阅(Publish-Subscribe)3动机将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。
我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了他们的可重用性。
4实用性1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
将二者封装在独立的对象中以使他们可以各自独立的改变和复用。
2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象待改变。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
换言之,你不希望这些对象是紧密耦合的。
5结构6参与者1、Subject(目标)—目标知道它的观察者。
可以有任意多个观察者观察同一个目标。
—提供注册和删除观察者对象的借口。
2、Observer(观察者)—为那些在目标发生改变时需获得通知的对象定义一个更新接口。
3、ConcreteSubject(具体目标)—将有关状态存入各ConcreteObserver对象。
—当它的状态发生改变时,向它的各个观察者发出通知。
4、ConcreteObserver(具体观察者)—维护一个指向ConcreteSubject对象的引用。
—存储有关状态,这些状态应与目标的状态保持一致。
—实现Observer的更新接口以使自身状态与目标的状态保持一致。
7优缺点1、使目标和观察者之间的耦合是抽象的最小的。
2、支持广播通信3、意外的更新因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。
在目标上一个看视无害的操作可能会引起一系列对观察者以及依赖这些观察者的那些对象的更新。
此外,如果依赖准则的定义或维护不当,常常会引起错误的更新,这种错误通常很难补捉。
代码实例本例子简单的模拟车辆运行和红绿灯的关系。
例子中实现了一个Signallamp的基类(observer),凡是继承这个基类的类都可以观察红绿灯信息,并让(concreteObserver)类Vehicle,继承Signallamp。
观察者模式简单例子
1. 嘿,你知道吗?就像你关注一个网红,你就是观察者,网红就是被观察者呀!比如说你特别喜欢的那个美食博主,每次他发布新视频你都第一时间知道,这就是观察者模式嘛!
2. 想想看,课堂上老师和学生,老师在讲台上一举一动,学生们都看着呢,学生们就是观察者呀!这多简单的例子呀,对吧!
3. 咱平常看电视剧的时候,你作为观众观察着剧中人物的悲欢离合,这不也是观察者模式嘛!就像追那部超火的剧,你不就时刻观察着主角们的故事发展嘛!
4. 再比如家长观察着孩子的成长,孩子的每一点进步家长都看在眼里,家长就是观察者啦。
你说这和观察者模式是不是很像哇!
5. 还有呢,球迷观察着自己喜欢的球队比赛,球员们在场上的表现都被球迷密切关注着,这就是一个很鲜活的观察者模式例子哟!
6. 去动物园的时候,我们游客观察着各种动物的行为,我们可是十足的观察者呀。
哎呀,这多明显呀!
7. 在公司里,领导观察着员工的工作状态,领导不就是那个观察者嘛!这不是和观察者模式一个道理嘛!
8. 走在路上,我们看着来来往往的路人,我们也是观察者呀!这些不都是生活中常见的观察者模式例子吗?
总之,观察者模式就在我们身边呀,随时随地都能发现呢!。
观察者模式和访问者模式的对比在软件设计中,设计模式是一种被广泛使用的软件开发经验,通过在设计中应用设计模式,可以提高代码的可复用性、可维护性、可扩展性,并且使代码更容易理解和修改。
观察者模式和访问者模式是两种常用的设计模式,它们都是在对象间进行通信的模式,但是它们的实现方式不同。
本文将对这两种模式进行对比,以帮助更好地理解它们的应用。
一、观察者模式观察者模式是一种对象间的一对多的依赖关系,其中一个主题对象(也称为可观察对象)通过添加多个观察者对象来通知多个观察者对象。
当主题对象的状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。
观察者模式的实现需要两个基本元素:主题和观察者。
主题是被观察者的对象,包含了状态和状态变化的操作。
主题维护一个观察者列表,当状态发生变化时,会遍历观察者列表,调用每个观察者对象的更新方法,通知它们更新自己的状态。
观察者是主题的依赖对象,负责接收主题状态的变化,并进行相应的处理。
观察者接收主题的状态变化通知后,就会调用特定的方法来完成自己的更新。
观察者模式的优点在于,当应用中的一个对象状态发生变化时,可以通知其他对象自动更新,不需要手动管理依赖对象之间的关系。
同时,观察者模式具有松耦合性,主题对象和观察者对象可以独立地扩展和改变,而不会影响到彼此的代码。
二、访问者模式访问者模式是一种将算法与对象结构分离的设计模式。
它是一种行为型模式,它通过在不改变对象自身的前提下,对对象的结构进行修改。
访问者模式将数据结构和数据操作分离,通过在数据结构上定义算法的方式,使得数据结构和算法各自独立,可以自由组合。
访问者模式的实现需要两个基本元素:访问者和被访问者。
访问者是用于定义针对某一种数据结构的操作,一般来说,访问者定义了一个访问者接口,包含了对被访问对象的不同访问操作,例如访问属性、调用方法、计算属性等。
被访问者是用于表示某一种数据结构的对象,它包含了一些属性和方法等其它的一些方法,被访问者还定义了一个接收访问者的方法,当访问者访问它时,会调用该方法,接收访问者并进行相应的处理。
目录1.观察者模式(Observer Pattern) (2)2.命令模式(Observer Pattern) (6)1.观察者模式(Observer Pattern)1.1.描述:[模式的定义和简单的具体描述]观察者模式定义了对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新。
观察者模式中关键的对象是目标(Subject)和观察着(observer)。
一个目标可以有任意数目的依赖它的观察者。
一旦目标的状态发生改变,所有的观察者都得到通知。
作为对这个通知的响应,每个观察者都查询目标以使其状态与目标状态同步。
1.2.类图:[模式的类图以及类图中每个类的说明]Subject(目标):定义了Suject的接口,一般使用抽象类(C++)或者接口(JAVA)的方式实现。
其中包含三个方法:Attach方法用于加入Observer,Dettach的方法用于移除Observer,Notify 方法用于通知Observer。
Observer(观察者):定义了Observer的接口,与Suject类似,一般使用抽象类(C++)或者接口(JAVA)的方式实现。
Update方法用于更新Observer的显示。
ConcreteSubject(具体目标):继承Suject抽象类(C++)或者实现了Suject接口(JAVA)的具体Suject类,负责保存注册的Observer以及在自身状态发生改变时通知Observer的具体实现。
ConcreteObserver(具体观察者):继承Observer抽象类(C++)或者实现了Observer接口(JAVA)的具体Observer 类。
保存所依赖的Suject对象的引用,并通过更新的方式保证自身的状态和所依赖的Suject 状态一致。
1.3.实现演示代码:[C++和Java都可以]简介:使用Observer模式实现以多种方式表示时间。
观察者模式和订阅者模式的比较在软件开发中,观察者模式和订阅者模式都是比较常见的设计模式。
它们都是用来实现对象间的通信,但是具体实现方式却有所不同。
本文将从概念、实现、适用场景等多个方面对这两种模式进行比较,并探讨它们的优缺点。
一、概念观察者模式和订阅者模式最大的区别在于概念上的差异。
观察者模式(Observer Pattern),又称发布-订阅模式(Publish/Subscribe Pattern),是定义对象间一种一对多的关系,使得每当一个对象状态发生改变时,所有依赖于它的对象都将得到通知并被自动更新。
在该模式中,发布者负责通知,订阅者负责接收通知并进行相应处理。
订阅者模式(Subscriber Pattern)是一种基于事件的异步编程模式,它的核心思想是定义了一个特定的事件,当这个事件发生时,所有订阅该事件的对象都能够收到通知。
与观察者模式类似,订阅者模式也是定义了一种一对多的关系,但是订阅者不需要知道发布者的存在,只需要关心自己订阅的事件即可。
二、实现方式观察者模式和订阅者模式的实现方式也有所区别。
观察者模式的实现方式通常需要以下几个角色:1. Subject(主题):负责通知观察者的变化。
2. Observer(观察者):接收主题的通知并进行相应处理。
3. ConcreteSubject(具体主题):实现Subject接口,维护观察者列表并通知观察者。
4. ConcreteObserver(具体观察者):实现Observer接口,在接收到主题通知后进行相应处理。
而订阅者模式的实现方式则主要有以下几个角色:1. Publisher(发布者):负责发布(触发)事件。
2. Subscriber(订阅者):订阅特定事件,并在事件发生时接收通知。
3. Event(事件):定义特定的事件类型。
4. EventDispatcher(事件调度器):维护事件和订阅者的关系,并向订阅者发送通知。
三、适用场景观察者模式和订阅者模式都适用于对象间的通信,但是在具体场景下的使用也有所不同。
观察者模式(Observer)
1.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一
个主体对象。
这个主体对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己
2.观察者模式的组成
1-抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。
抽象主题提供一个接口,可以增加和删除观察者角色。
一般用一个抽象类或接口来实现。
2-抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己
3-具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。
具体主题角色通常用一个子类实现
4-具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。
如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
通常用一个子类实现。