C#设计模式观察者

    /**/
    /// <summary>
    ///     在Observer Pattern(观察者模式)中,此类作为所有Subject(目标)的抽象基类
    /// 所有要充当Subject的类(在此事例中为"猫")都继承于此类.
    ///     我们说此类作为模型,用于规划目标(即发布方)所产生的事件,及提供触发
    /// 事件的方法.
    ///     此抽象类无抽象方法,主要是为了不能实例化该类对象,确保模式完整性.
    ///     具体实施:
    ///     1.声明委托
    ///     2.声明委托类型事件
    ///     3.提供触发事件的方法
    /// </summary>
    public abstract class ModelBase
    {
        public ModelBase()
        {

        }

        /// <summary>
        /// 声明一个委托,用于代理一系列"无返回"及"不带参"的自定义方法
        /// </summary>
        public delegate void SubEventHandler();


        /// <summary>
        /// 声明一个绑定于上行所定义的委托的事件
        /// </summary>
        public event SubEventHandler SubEvent;

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


    }







    public abstract class Observer
    {
        /**/
        /// <summary>
        /// 构造时通过传入模型对象,把观察者与模型关联,并完成订阅.
        /// 在此确定需要观察的模型对象.
        /// </summary>
        /// <param name="childModel">需要观察的对象</param>
        public Observer(ModelBase childModel)
        {
            //订阅
            //把观察者行为(这里是Response)注册于委托事件
            childModel.SubEvent += new ModelBase.SubEventHandler(Response);
        }


        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("cat cry:");
            this.Notify();
        }                
        
    }

    public class Mouse : Observer
    {
        public string Name { get; set; }

        public Mouse(string name, ModelBase childModelBase)
            : base(childModelBase)
        {
            Name = name;

        }
        public override void Response()
        {
            Console.WriteLine(string.Format("{0} running!",this.Name));    
        }  
    }


    public class Children : Observer2
    {
        public string Name { get; set; }

        public Children(string name, ModelBase childModelBase) : base(childModelBase)
        {
            Name = name;
        }

        public override void Response1()
        {
            Console.WriteLine(string.Format("{0} weak!", this.Name));
        }

        public override void Response2()
        {
            Console.WriteLine(string.Format("{0} cry!", this.Name));
        }  

    }
class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();

            Mouse mouse=new Mouse("mouse",cat);

            Children cl=new Children("baby",cat);
            cat.Cry();

            Console.ReadKey();
        }
    }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值