事件模拟场景:猫叫->老鼠逃跑 & 主人惊醒

  这是一个典型的观察者模式的应用场景,事件的发源在于猫叫这个动作,在猫叫之后,老鼠开始逃跑,而主人则会从睡梦中惊醒。可以发现,主人和老鼠这两个类型的动作相互之间没有联系,但都是由猫叫这一事件触发的。

  设计的大致思路在于,猫类包含并维护一个猫叫的动作,主人和老鼠的对象实例需要订阅猫叫这一事件,保证猫叫这一事件发生时主人和老鼠可以执行相应的动作。

  (1)设计猫类,为其定义一个猫叫的事件CatCryEvent:

    public class Cat
    {
        private string name;
        // 猫叫的事件
        public event EventHandler<CatCryEventArgs> CatCryEvent;

        public Cat(string name)
        {
            this.name = name;
        }

        // 触发猫叫事件
        public void CatCry()
        {
            // 初始化事件参数
            CatCryEventArgs args = new CatCryEventArgs(name);
            Console.WriteLine(args);
            // 开始触发事件
            CatCryEvent(this, args);
        }
    }

    public class CatCryEventArgs : EventArgs
    {
        private string catName;

        public CatCryEventArgs(string catName)
            : base()
        {
            this.catName = catName;
        }

        public override string ToString()
        {
            string message = string.Format("{0}叫了", catName);
            return message;
        }
    }

  (2)设计老鼠类,在其构造方法中订阅猫叫事件,并提供对应的处理方法

    public class Mouse
    {
        private string name;
        // 在构造方法中订阅事件
        public Mouse(string name, Cat cat)
        {
            this.name = name;
            cat.CatCryEvent += CatCryEventHandler;
        }

        // 猫叫的处理方法
        private void CatCryEventHandler(object sender, CatCryEventArgs e)
        {
            Run();
        }

        // 逃跑方法
        private void Run()
        {
            Console.WriteLine("{0}逃走了:我勒个去,赶紧跑啊!", name);
        }
    }

 (3)设计主人类,在其构造犯法中订阅猫叫事件,并提供对应的处理方法

    public class Master
    {
        private string name;

        // 在构造方法中订阅事件
        public Master(string name, Cat cat)
        {
            this.name = name;
            cat.CatCryEvent += CatCryEventHandler;
        }

        // 针对猫叫的处理方法
        private void CatCryEventHandler(object sender, CatCryEventArgs e)
        {
            WakeUp();
        }

        // 具体的处理方法——惊醒
        private void WakeUp()
        {
            Console.WriteLine("{0}醒了:我勒个去,叫个锤子!", name);
        }
    }

  (4)最后在Main方法中进行场景的模拟:

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat("假老练");
            Mouse mouse1 = new Mouse("风车车", cat);
            Mouse mouse2 = new Mouse("米奇妙", cat);
            Master master = new Master("李扯火", cat);
            // 毛开始叫了,老鼠和主人有不同的反应
            cat.CatCry();

            Console.ReadKey();
        }
    }

  这里定义了一只猫,两只老鼠与一个主人,当猫的CatCry方法被执行到时,会触发猫叫事件CatCryEvent,此时就会通知所有这一事件的订阅者。本场景的关键之处就在于主人和老鼠的动作应该完全由猫叫来触发。下面是场景模拟代码的运行结果:

  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三天不学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值