大话设计模式之观察者模式

从前,有个放羊娃。每天都去山上放羊,一天,他认为十分无聊。就想了个捉弄大家寻开心的主意。

他向着山下正在种田的农夫们大声喊:“狼来了!狼来了!救命啊!

”农夫们听到喊声急忙拿着锄头和镰刀往山上跑,他们边跑喊:“不要怕,孩子,我们来帮你打恶狼!”农夫们气喘吁吁地赶到山上一看,连狼的影子也没有!放羊娃哈哈大笑:“真有意思,你们上当了!

”农夫们生气地走了。第二天,放羊娃故伎重演,善良的农夫们又冲上来帮他打狼,可还是没有见到狼的影子。

放羊娃笑得直不起腰:“哈哈。你们又上当了!哈哈。”大伙儿对放羊娃一而再再而三地说谎十分生气,从此再也不相信他的话了。 
       过了几天。狼真的来了。一下子闯进了羊群。

放羊娃害怕极了,拼命地向农夫们喊:“狼来了!

狼来了!

快救命呀!狼真的来了!

”农夫们听到他的喊声,以为他又在说谎,大家都不理睬他,没有人去帮他,结果放羊娃的很多羊都被狼咬死了。小时候总是缠着爸爸给我讲故事。爸爸不厌其烦的讲着。我乐呵呵的听着,就这样我童年的生活在爸爸多姿多彩的故事中度过,当年听这个故事。仅仅有一个感悟,做人要诚实。然而今天我换了一个角度看这个故事,摇身一变,她就成了我的设计模式--观察者模式。

所谓的观察者模式。在此种模式中,一个目标物件管理全部相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。首先来看一下我们观察者模式的结构图:

依旧以上述狼来了的故事为例。看看这个故事到底是如何在我们的编程中实现呢?简单概括上述的故事就是。狼来了,放羊娃通知。农夫放下手头工作赶来救羊:

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

namespace 观察者模式
{
    class Program
    {
        static void Main(string[] args)
        {
            //狼来了
            Wolf wolf = new Wolf();

            //锄草的农夫
             WeedingObserver Farmer1 = new WeedingObserver();
            //浇水的农夫
            WateringObserver Farmer2 = new WateringObserver();

            wolf.Update += new EventHandler(farmer1.StopWeeding);
            wolf.Update += new EventHandler(farmer2.StopWatering);

            //狼来了
            wolf.SubjectState = "狼来了!";
            //发出通知
            wolf.Notify();

            Console.Read();

        }
    }

    //通知者接口
    interface Subject
    {
        void Notify();
        string SubjectState
        {
            get;
            set;
        }
    }

    //事件处理程序的托付
    delegate void EventHandler();

    class Shepherd: Subject
    {
        //声明一事件Update。类型为托付EventHandler
        public event EventHandler Update;

        private string action;

        public void Notify()
        {
            Update();
        }
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }

    class Wolf: Subject
    {
        //声明一事件Update,类型为托付EventHandler
        public event EventHandler Update;

        private string action;

        public void Notify()
        {
            Update();
        }
        public string SubjectState
        {
            get { return action; }
            set { action = value; }
        }
    }

    //锄草的农夫
    class  WeedingObserver
    {
        private string name;
        private Subject sub;
        public  WeedingObserver(string name, Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }

        //停止锄草工作
        public void StopWeeding()
        {
            Console.WriteLine("{0} {1} 停止锄草工作,赶去救羊!

", sub.SubjectState, name);
        }
    }

    //浇水的农夫
    class WateringObserver
    {
        private string name;
        private Subject sub;
        public WateringObserver(string name, Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }

        //停止浇水
        public void StopWatering()
        {
            Console.WriteLine("{0} {1} 停止浇水工作,赶去救羊!

", sub.SubjectState, name);
        }
    }
}

    观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同一时候监听某一个主体对象,这个主题对象在状态发生变化时,会通知全部观察者。

当一个对象改变须要同一时候改变其它对象,并且他不知道详细有多少对象须要改变的时候,考虑使用观察者模式。设计之旅,未完待续......

时间: 2024-10-14 20:33:17

大话设计模式之观察者模式的相关文章

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

<十>读<<大话设计模式>>之观察者模式

观察者模式也是比较简单的一种模式,可能从名字上理解无法明白,但真正理解其含义之后就非常简单了,说实话在自己来发的项目中自己也用到过,只不过不知道它叫观察者罢了,只要懂面向对象的对继承多态理解很深的,玩观察者模式很随意就能用到项目中去. 这本书用一个很形象的故事解释了观察者模式,故事情景:公司员工当老板不在时有的炒股有的看NBA,为了防止老板偷袭,让前台MM通知.即前台MM充当了观察者,而员工属于具体的实例对象了.我们要编写的代码就是MM作为通知类,员工作为被通知者, 观察者模式:定义了一种一对多

笔记-大话设计模式-14 观察者模式

观察者模式又叫做发布-订阅(Publish/Subscribe)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观察者模式所做的工作其实就是解除耦合.让耦合的双方都依赖于抽象,而不是依赖于具体.从而使得各自的变化都不会影响另一边的变化. Demo1: interface Subject { void Attach(Observer observer); void Detach(Ob

大话设计模式观察者模式

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

大话设计模式C++版——观察者模式

观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式. 这里以大话设计模式中的例子为例,办公室员工A.B.C在看股票看电影,这时老板回来了,被A.B.C重金贿赂后的前台MM发出通知给A.B.C,A.B.C收到通知后赶紧关电脑,关股票窗口,装作在干活. 1.观察者接口 class IObserver { public: virtual ~IObserver() {} virtual void OnEvent(TSt

java 之 观察者模式(大话设计模式)

观察者模式,笔者以前做校验订单时用过一次,只是不知道有这个模式,当时使用观察者省略了N多if else 在笔者看来观察者模式比较试用于一个对象状态改变后,很多个对象也要根据这个状态做相应的动作,当然观察者模式只是给大家开了一扇门,更希望的是灵活运用,而不是拘泥于细节, 我们可以从中汲取到把实现相同接口的类来放到集合里,然后便利集合调取公共方法去完成相应的工作,先看下类图 大话设计模式-类图 基于类图笔者写了如下的简单的实例. /** * 通知者抽象接口 */ public interface I

大话设计模式读书笔记--设计模式总结

前言 大话设计模式看了两遍,之前看过一遍,理解的不深刻, 这次用了一个月多点的时间再次温习,利用下班后的时间回来学习,把学习心得记录下来,加深了对面向对象的理解 之前是看到一个需求搞清楚业务流程之后立刻就去做了,很少从设计层面的角度考虑,现在在开发程序时,开始有了设计的思想,也有了达到可维护,可复用,可扩展目的具体的实现方法 每当看到经过优化代码的效果时,就想起一句话:精彩的代码是如何想出来的,比看到精彩的代码更加令人兴奋 下面是用自己的话进行的总结,以便加深记忆和理解 创建型 抽象工厂 定义:

大话设计模式宏观把控

大话设计模式是我们现在学习的一个重头戏--本来看完C#视频之后,什么都不懂,但看了设计模式书的附录之后,真的感觉瞬间柳暗花明的赶脚呀!现在让我们先来全局的看一下这本书-- 本书通过一些幽默的小例子,以大鸟和小菜对话的方式,主要讲了模式和原则,不得不用一句俗语说:真是生动形象呀! 我把这些模式根据其特点,分成了创建型模式.结构型模式和行为型模式. 模式: 1.策略模式(Strategy):义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户.(商场打折促

【设计模式】观察者模式

生活中,当某件事发生时,应该通知所有的相关者.例如,上课地点有变,要通知所有学习这门课的同学. 在软件设计中,当一个对象的状态发生变化是,如何通知与它相关的所有对象,就是我们今天要谈到的观察者模式. 观察者模式 概述 定义了一种一对多的依赖关系.让多个观察者对象同事监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己. 实际上,观察者模式所做的工作就是在解除耦合.让耦合的双方都依赖于抽象,而不是依赖于具体.从而使得各自的变化都不会影响另一边的变化. 结