//程序设计 : 猫叫一声,所有的老鼠都开始逃跑,主人被惊醒。

//要求: 1. 要有联动性,老鼠和主人的行为是被动的。 2. 考虑可扩展性,猫的叫声可能引起其他联动效应。
 
//加注释序号部分为创建和使用事件的语言结构描述的步骤
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace CatMouseAndMaster
{
    //1.为事件定义一个代理
    //定义一个委托类型,用于指定事件触发时被调用的方法类型
    public delegate void SubEventHandler(object sender,CryArgs cryArgs);
 
    //2.创建一个包含事件信息的类
    //定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承与System.EventArgs)
    public class CryArgs : EventArgs
    {
        public readonly string Name;
        public CryArgs(string name)
        {
            this.Name = name;
        }
    }
 
    //3.创建包含事件成员的类
    //定义一个事件成员
    public class Subject
    {
        //(1)定义事件成员
        public event SubEventHandler SubEvent;
 
        //(2)创建触发事件的方法
        protected virtual void FireAway(CryArgs cryAgrs)
        {
            if (SubEvent != null)
            {
                //通过事件成员SubEvent调用事件代理,并由代理调用注册的处理事件的方法
                this.SubEvent(this, cryAgrs);
            }
        }
    }
 
    public class Cat : Subject
    {
        private string name;
 
        public Cat(string name)
        {
            this.name = name;
        }
 
        public void Cry()
        { 
            //创建CryArgs类的对象
            CryArgs cryArgs = new CryArgs(name);
            this.FireAway(cryArgs);
        }
    }
 
    //4.创建事件处理方法
    //定义一个受保护的虚方法,负责通知事件的登记对象
    public abstract class Observer
    {
        public Observer(Subject sub)
        {
            //5.将事件处理方法和事件关联起来
            sub.SubEvent += new SubEventHandler(Response);
        }
 
        public abstract void Response(object sender, CryArgs cryArgs);
    }
 
    //定义一个方法,将输入转化为期望的事件
    public class Mouse : Observer
    {
        private string name;
        public Mouse(string name,Subject sub)
            :base(sub)
        {
            this.name = name;
        }
 
        public override void Response(object sender, CryArgs cryArgs)
        {
            Console.WriteLine(cryArgs.Name + "叫," + name + "开始逃跑");
        }
    }
 
    public class Master : Observer
    {
        public Master(Subject sub)
            : base(sub)
        { 
            
        }
 
        public override void Response(object sender, CryArgs cryArgs)
        {
            Console.WriteLine(cryArgs.Name + "叫,主人醒了");
        }
    }
 
    class Program
    {
        //6.组成完整的创建事件和使用事件的程序
        static void Main(string[] args)
        {
            Cat c = new Cat("猫");
            Mouse mouse = new Mouse("老鼠",c);
            Master master = new Master(c);
 
            c.Cry();
        }
    }
}