一口一个设计模式--观察者模式

5月初,我们三个小伙伴开始着手准备机房收费系统合作版,借此大好良机,我准备把设计模式写成一个博客专栏,站在一个更高的角度品味前人的思想精髓。设计模式分为三类--创建型、结构型、行为型,咱们就先从行为型模式--观察者模式开讲。

开讲之前,我先给大家讲个小故事,以便大家快速认识观察者模式。在战争年代,战争双方不时受到敌军飞机的轰炸,于是人们发明了航空警报,并派几个侦察兵放哨,一但敌机来临,立即拉响航空警报,这样所有的收听者就能听到报警逃跑。上述情节,看似平常,其实是观察者模式是完美体现。下图是针对上述情节的形象解说。

航空警报是个公共的接口,所有侦察兵实现了航空警报的接口,都有报警的功能。这样设计的好处是公民只需认真听航空警报是否报警即可,没必要知道是谁报的警。航空警报依赖于收听者,因为如果没有人收听,即时报警又有什么用呢?

说到这,思想大家应该都能领悟了,但具体该如何实现呢?下面是对上图的代码实现。

航空警报代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 观察者模式
{
    interface 航空警报
    {
        void 增加(收听者 listener);
        void 减少(收听者 listener);
        void 报警();
    }
}

侦察兵A代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 观察者模式
{
    class 侦察兵A:航空警报
    {
        private IList<收听者> listeners = new List<收听者>();
        public void 增加(收听者 listener)
        {
            listeners.Add(listener);
        }
        public void 减少(收听者 listener)
        {
            listeners.Remove(listener);
        }
        public void 报警()
        {
            foreach (收听者 listener in listeners)
            {
                listener.逃跑();
            }
        }
    }
}

侦察兵B与侦察兵A功能相同,所以代码基本一样,在此不再赘述。

收听者代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 观察者模式
{
    abstract class 收听者
    {
        protected 航空警报 airalert;
        public 收听者(航空警报 airalert)
        {
            this.airalert = airalert;
        }
        public abstract void 逃跑();
    }
}

公民A代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 观察者模式
{
    class 公民A:收听者
    {
        public 公民A(航空警报 airalert):base(airalert)
        {
        }
        public override void 逃跑()
        {
            Console.WriteLine("我是公民A,快跑,航空警报响了");
        }
    }
}

公民B与公民A身份相同,所以代码实现基本一样,在此不再赘述。

主方法代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 观察者模式
{
    class Program
    {
        static void Main(string[] args)
        {
            侦察兵A observerA = new 侦察兵A();

            公民A citizenA = new 公民A(observerA);
            公民B citizenB = new 公民B(observerA);

            observerA.增加(citizenA);
            observerA.增加(citizenB);

            observerA.报警();

            侦察兵B observerB = new 侦察兵B();
            observerB.增加(citizenA);
            observerB.增加(citizenB);

            observerB.报警();
        }
    }
}

运行效果图:

通过运行效果图可以看出,当侦察兵A报警后,监听航空警报的公民都会收到通知逃跑,侦察兵B报警效果一样。

在C#中好比事件和委托,用委托监视事件发生,一但事件发生,委托会把事件传递给监听者,监听者对此采取相应对策。

知识来源于生活,会生活的人才能学习好。巨人对生活进行了思考,并他们能把生活总结为一个个经典思想,而我们只是轻轻飘过,不带有一片云彩,这就是我们和巨人的差距。希望大家能留心生活的点点滴滴,它们将成为你学习知识的灵感之源。

一口一个设计模式--观察者模式

时间: 2024-10-17 04:54:02

一口一个设计模式--观察者模式的相关文章

一口一个设计模式--简单工厂VS工厂VS抽象工厂

前几天一直在准备大学毕业,始终脱不开身,今天终于有时间进行设计模式的研究.咱们今天研究的话题是工厂家族三种设计模式的对比--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单工厂的升级版,抽象工厂是工厂模式的升级版,简单工厂+抽象工厂是抽象工厂的升级版.知道了它们之间的宏观关系,下面我带它们从一次次蜕变了解它们为什么是这样的关系. 我们最原始的代码思维是把所有的实现都放在一个类中,功能虽然是实现了,但耦合性非常高,很不方便维护,好比活字印刷术之前的印刷,一个地方需要修改,

五分钟一个设计模式之观察者模式

五分钟一个设计模式,用最简单的方法来描述设计模式. 认识观察者模式 观察者模式的定义是:定义对象间的一种一对多的依赖关系.当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新 报社跟读者的例子 我们用报社和读者之间的关系来模拟观察者模式. 包含以下主体: 报社(NewspaperOffice) 读者接口(Reader) 具体读者(Reader_二逼青年.Reader_文艺青年) Reader_二逼青年.Reader_文艺青年实现Reader接口,并订阅报纸,报社有新报纸时,会通知所

【转】设计模式-观察者模式

设计模式-观察者模式 定义 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或 从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各 观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 基本简介 观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务 数据是被观察

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

C#设计模式---观察者模式简单例子

在开发过程中经常遇到一个模块中的 一个方法调用了其他模块中相关的方法 比如说在一个系统中,如果出现了错误,就调用专门进行错误处理的模块中的方法进行错误处理 而因为错误处理的操作有很多,所以将这些具体的操作封装在其他的模块中 在专门进行错误处理的模块中调用其他模块中的错误操作方法 这样一来在主系统中只要实例化专门进行错误处理的模块对象 并调用其相关的方法,其他模块中的具体方法也都会被执行 这时专门进行错误处理的模块被称为发布者 其他拥有具体错误操作的模块称为订阅者 只要发布者一发布信息(方法被调用

java设计模式--观察者模式和事件监听器模式

文章转载于:http://www.java2000.net/p9452 复习设计模式,看到observer观察者模式,说法是该模式和iterator迭代器模式类似已经被整合进jdk,但是jdk提供了两种接口: 一.java.util.Observer -- 观察者接口 对应: java.util.Observable --受查者根类 二.java.util.EventListener -- 事件监听/处理接口 对应: java.util.EventObject -- 事件(状态)对象根类 研究了

每天一个设计模式-3 适配器模式(Adapteer)

每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来了“适配器”. 2.联系编程 有一个电源类,一个旧的硬盘类,还有一个新硬盘类:电源类能直接适配旧硬盘类,但不能和新硬盘适配. 这时,可以添加一个适配器类,这里采用对象引用的方式实现适配器. 3.类图 模式简图: 测试时使用的类图: 4.代码 NewDiskApi: public interface

学习设计模式--观察者模式(C++)

1. 说说简单的函数回调 首先说说一种简单的函数回调机制(一种通过获取对象的指针来进行函数的调用方法)以下是代码演示--- 这是观察者(被回调)部分: class Observer { public: // 抽象观察者的纯虚函数 virtual void UpdateMessage() = 0; }; class ConcreteObserver : public Observer { public: // 实现抽象类的纯虚函数 void UpdateMessage(); } void Conc

大话设计模式观察者模式

从前,有个放羊娃,每天都去山上放羊,一天,他觉得十分无聊,就想了个捉弄大家寻开心的主意.他向着山下正在种田的农夫们大声喊:"狼来了!狼来了!救命啊!"农夫们听到喊声急忙拿着锄头和镰刀往山上跑,他们边跑喊:"不要怕,孩子,我们来帮你打恶狼!"农夫们气喘吁吁地赶到山上一看,连狼的影子也没有!放羊娃哈哈大笑:"真有意思,你们上当了!"农夫们生气地走了.第二天,放羊娃故伎重演,善良的农夫们又冲上来帮他打狼,可还是没有见到狼的影子.放羊娃笑得直不起腰:&q