• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

C#观察者设计模式


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

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

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



Chinar —— 心分享、心创新!

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

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


Chinar 教程效果:

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


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


Police —— 警察类


这个类用来表示警察

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

也可以理解为广播:当警察看向四周,所有小偷都接收到了广播

    /// <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 —— 小偷


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

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

就是让所有小偷、订阅警察看向四周的事件,从而达到设计目的

    /// <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 —— 主入口


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

直观的表示事件变动

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

/// <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() 被调用的时候,小偷才跑

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

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

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

支持

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


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

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

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


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


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

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

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

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




Chinar


END

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

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

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# / SQL 保留两位小数的各种方法发布时间:2022-07-10
下一篇:
C#中的@符号发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap