C#观察者设计模式


本文提供全流程,中文翻译。

Chinar 坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



Chinar —— 心分享、心创新!

助力快速理解 观察者设计模式

为新手节省宝贵的时间,避免采坑!


Chinar 教程效果:

刑警警察叔叔注视了一下四周穿黑色衣服的:神偷 - 跑了穿白色衣服的:笨贼 - 跑了穿平常色衣服的:平民 - 跑了穿红色衣服的:强盗 - 跑了


全文高清图片,点击即可放大观看 (很多人竟然不知道)


1

Police —— 警察类


这个类用来表示警察

当警察看向四周的时候,所有事件下的订阅者,都会被调用到

也可以理解为广播:当警察看向四周,所有小偷都接收到了广播
举个栗子黑白88

    /// <summary>    /// 警察类    /// </summary>    class Police    {        private      string type;       //类型        private      string name;       //名称        public event Action PoliceLook; //委托+event变事件        /// <summary>        /// 构造函数        /// </summary>        /// <param name="type">类型</param>        /// <param name="name">名称</param>        public Police(string type, string name)        {            this.type = type;            this.name = name;        }        /// <summary>        /// 注视        /// </summary>        public void LookAt()        {            Console.WriteLine(type + name + "注视了一下四周");            if (PoliceLook != null)            {                //外部调用LookAt后,当警察注视周围的时候。会调用事件对象中,所有订阅的用户(也就是所有小偷,因为所有小偷都订阅了)                PoliceLook();            }        }        //区别:        //1.事件不能在类的外部,通过类对象调用;事件提供广播,订阅        //2.委托可以,在内外调用        //3.事件表达外发的接口、委托常用回调函数        //

2

Thief —— 小偷


这个类用来表示小偷,具备基本属性名字、颜色、逃跑功能

那什么时候逃跑呢??就是当警察看向四周的时候逃跑

就是让所有小偷、订阅警察看向四周的事件,从而达到设计目的
举个栗子黑白88

    /// <summary>    /// 小偷类    /// </summary>    class Thief    {        private string name;  //名字        private string color; //衣服颜色        /// <summary>        /// 构造        /// </summary>        /// <param name="name">小偷名</param>        /// <param name="color">衣服颜色</param>        /// <param name="police">警察</param>        public Thief(string name, string color, Police police)        {            this.name         =  name;            this.color        =  color;            police.PoliceLook += Run; //把自身的逃跑方法,注册/订阅 警察类的事件对象中。一旦警察有Look这个动作,Run方法就会执行        }        /// <summary>        /// 小偷逃跑打印方法        /// </summary>        public void Run()        {            Console.WriteLine("穿" + color + "衣服的:" + name + " - 跑了");        }    }

3

Main —— 主入口


这个类用来测试、打印输出结果

直观的表示事件变动

这个观察者设计模式很简单,直观的即可明白事件、委托是怎样传递信息的
举个栗子黑白88

/// <summary>    /// 测试类——用来输出结果    /// </summary>    class Program    {        /// <summary>        /// 程序主入口        /// </summary>        /// <param name="args"></param>        static void Main(string[] args)        {            Police police = new Police("刑警", "警察叔叔");            Thief  thief1 = new Thief("神偷", "黑色",  police);            Thief  thief2 = new Thief("笨贼", "白色",  police);            Thief  thief3 = new Thief("平民", "平常色", police);            Thief  thief4 = new Thief("强盗", "红色",  police);            //police.PoliceLook += thief1.Run;//这种方法没有上边直接构造简单,目的都一样            //police.PoliceLook += thief2.Run;            //police.PoliceLook += thief4.Run;            police.LookAt(); //当警察对象有所动作的时候,所以订阅了的小偷。都会被传达信息,从而调用事件中封装的所有订阅者函数            Console.ReadLine();        }    }

4

Console —— 控制台输出


F5控制台输出结果

会发现,只有当 police.LookAt() 被调用的时候,小偷才跑

否则,小偷都没有任何动作

简单的一个小例子,可直观的看出事件/委托是如何传递不同类之间的调用关系
举个栗子黑白88

刑警警察叔叔注视了一下四周穿黑色衣服的:神偷 - 跑了穿白色衣服的:笨贼 - 跑了穿平常色衣服的:平民 - 跑了穿红色衣服的:强盗 - 跑了

支持

May Be —— 搞开发,总有一天要做的事!


拥有自己的服务器,无需再找攻略!

Chinar 提供一站式教程,闭眼式创建!

为新手节省宝贵时间,避免采坑!


先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


1 —— 云服务器超全购买流程 (新手必备!)

2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

3—— Windows 服务器配置、运行、建站一条龙 !

4 —— Linux 服务器配置、运行、建站一条龙 !



70

Chinar


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

收藏 打印