c#观察者模式

<span style="color: rgb(51, 51, 51); font-family: arial, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现--这一点为程序提供了更大的灵活性。</span>

namespace Demo1
{
    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat(); //被观察的对象
            Mouse mouse = new Mouse("老鼠",cat);
            Master master = new Master("主人",cat);
            Baby baby = new Baby("宝贝",cat);
            cat.Cry();
            Console.Read();
        }
    }

    public abstract class ModelBase //在Observer Pattern(观察者模式)中,此类作为所有Subject(目标)的抽象基类
    {
        public ModelBase()
        {

        }
        public delegate void SubEventHandler(); 
        public event SubEventHandler SubEvent;

        /// <summary>
        /// 封装了触发事件的方法
        /// 主要为了规范化及安全性,除观察者基类外,其派生类不直接触发委托事件
        /// </summary>
        protected void Notify()
        {
            //提高执行效率及安全性
            if(this.SubEvent!=null)
                this.SubEvent();          
        }
    }

    public abstract class Observer //在Observer Pattern(观察者模式)中,此类作为所有Observer(观察者)的抽象基类
    {
        /// 构造时通过传入模型对象,把观察者与模型关联,并完成订阅.
        /// 在此确定需要观察的模型对象.
        /// </summary>
        /// <param name="childModel">需要观察的对象</param>

        public Observer(ModelBase childModel)
        {
            //订阅,把观察者行为(这里是Response)注册于委托事件
            childModel.SubEvent+=new ModelBase.SubEventHandler(Response);
        }
       /// <summary>
       /// 规划了观察者的一种行为(方法),所有派生于该观察者基类的具体观察者都
       /// 通过覆盖该方法来实现作出响应的行为.
       /// </summary>
       public abstract void Response();
    }

    public abstract class Observer2  //同样是观察者,只是比上面多了一种方法
    {
        public Observer2(ModelBase childModel)
        {
            childModel.SubEvent += new ModelBase.SubEventHandler(Response1);
            childModel.SubEvent += new ModelBase.SubEventHandler(Response2);
        }

        public abstract void Response1();
        public abstract void Response2();
    }

    public class Cat : ModelBase   //被观察的对象
    {
        public Cat()
        {
        }
        //定义一个行为,猫大叫
        public void Cry()
        {
            Console.WriteLine("猫大叫");
            this.Notify(); //调用基类的方法,触发事件
        }
    }

    public class Mouse : Observer  //观察者,老鼠
    {
        private string _name;
        public Mouse(string name,ModelBase childModel):base(childModel)
        {
           //初始化字段,老鼠的名字
            this._name = name;
        }
        //覆盖基类方法
        public override void Response()
        {
            Console.WriteLine("老鼠赶快逃跑");
        }
    }

    public class Master : Observer //观察者,主人
    {
        private string _name;
        public Master(string name,ModelBase childModel):base(childModel)
        {
            this._name = name;
        }

        public override void Response()
        {
            Console.WriteLine("主人醒了!");
        }
    }

    public class Baby : Observer2 //观察者,Baby
    {
        private string _name;
        public Baby(string name,ModelBase childModel):base(childModel)
        {
            this._name = name;
        }
        public override void Response1()
        {
            Console.WriteLine("宝贝醒了");
        }
        public override void Response2()
        {
            Console.WriteLine("宝贝开始哭啦");
        }
   }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值