zoukankan      html  css  js  c++  java
  • 大话设计模式之观察者模式

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

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

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

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

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

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

    狼来了!

    快救命呀!狼真的来了!

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

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

            

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

             

    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); } } }

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

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

              

              

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6808301.html
Copyright © 2011-2022 走看看