Unity 3D观察者设计模式-C#委托和事件的运用

71 篇文章 4 订阅
48 篇文章 6 订阅

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 服务器配置、运行、建站一条龙 !




<script type="math/tex" id="MathJax-Element-2"> </script>
Chinar


END

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值