• 观察者模式之Tom and Jerry


    namespace TomAndJerry
    {
        class Program
        {
            static void Main(string[] args)
            {
                #region 通过接口来完成
                ////猫
                //Tom t = new Tom();
                ////Mouse
                //Jerry j = new Jerry(t);
                //Jerry j1 = new Jerry(t);
                ////Owner
                //Owner o = new Owner(t);

                //t.Cry();
                //Console.Read();
                #endregion

                #region 通过事件来完成

                //Cat cat = new Cat("Tom");
                ////建立关系
                //Mouse jerry = new Mouse("Jerry", cat);

                //Owner o = new Owner("Jason", cat);

                ////Tom 触发事件
                //cat.CatCry();

                //Console.Read();

                #endregion

                #region 通过抽象类完成

                Cat cat = new Cat();
                Mouse jerr = new Mouse(cat);
                Owner o = new Owner(cat);

                cat.Cry();
                Console.Read();

                #endregion

            }
        }

        #region 通过接口完成

        ////定义主动者接口
        //public interface IInitiative
        //{
        //    //通知的方法,要与接受者建立关系
        //    void Notice(IReceivenotice irnotice);
        //}

        ////定义接受者接口
        //public interface IReceivenotice
        //{
        //    //有一个表现的方法
        //    void Show();
        //}

        ////定义Tom 类,Tom 是主动者,继承主动者接口, 由它发出并触发相应的事件
        //public class Tom : IInitiative
        //{
        //    //由于发出的主动者不确定,所以放在一个数组中
        //    ArrayList alist = new ArrayList();

        //    #region IInitiative 成员

        //    public void Notice(IReceivenotice irnotice)
        //    {
        //        //建立起通知关系
        //        alist.Add(irnotice);
        //    }

        //    //猫叫的事件
        //    public void Cry()
        //    {
        //        Console.WriteLine("Tom is crying");
        //        //主动者发出的通知,接受者做出的反应都放到alist中,调用接受者的反应
        //        foreach (IReceivenotice notice in alist)
        //        {
                   
        //            notice.Show();
                   
        //        }
        //    }

        //    #endregion
        //}

        ////定义Jerry 类, Jerry 是接受者,继承接受者的接口
        //public class Jerry : IReceivenotice
        //{
        //    public Jerry()
        //    { }

        //    //明确是谁来通知的,一般有接口的父类来通知
        //    public Jerry(IInitiative iiative)
        //    {
        //        //this 表示此接口的实例
        //        iiative.Notice(this);
        //    }

        //    #region IReceivenotice 成员

        //    public void Show()
        //    {
        //        //收到通知后,产生活动
        //        Console.WriteLine("Jerry is running crazy!");
        //    }

        //    #endregion
        //}

        ////定义Owner 类, Owner 是接受者,继承接受者的接口
        //public class Owner : IReceivenotice
        //{
        //    public Owner()
        //    { }

        //    //明确是谁来通知的,一般有接口的父类来通知
        //    public Owner(IInitiative iiative)
        //    {
        //        iiative.Notice(this);
        //    }

        //    #region IReceivenotice 成员

        //    public void Show()
        //    {
        //        ////收到通知后,产生活动
        //        Console.WriteLine("The owner is wakeup , cry :'Tom , what are you doing ?'");
        //    }

        //    #endregion
        //}

        #endregion

        #region 通过事件完成

        #region 猫
        //public class Cat
        //{
        //    //猫的名字
        //    private string _name;

        //    //猫叫的事件
        //    public event EventHandler<CatCryEventArgs> CatCryEvent;

        //    //构造函数
        //    public Cat()
        //    { }
        //    public Cat(string name)
        //    {
        //        this._name = name;
        //    }

        //    //触发猫叫的事件
        //    public void CatCry()
        //    {
        //        CatCryEventArgs args = new CatCryEventArgs(_name);
        //        Console.WriteLine(args);
        //        CatCryEvent(this, args);
        //    }
        //}
        #endregion

        #region 猫叫的事件

        //public class CatCryEventArgs : EventArgs
        //{
        //    //发出叫声的猫的名字
        //    private string _name;
        //    //构造函数
        //    public CatCryEventArgs()
        //    { }
        //    public CatCryEventArgs(string name)
        //    {
        //        this._name = name;
        //    }

        //    //输出参数的内容
        //    public override string ToString()
        //    {
        //        return _name + " crying !";
        //    }
        //}

        #endregion
       
        #region 主人

        //public class Owner
        //{
        //    //主人的名
        //    private string name;

        //    //构造函数
        //    public Owner()
        //    { }
        //    public Owner(string _name,Cat cat)
        //    {
        //        this.name = _name;
        //        cat.CatCryEvent += new EventHandler<CatCryEventArgs>(CatCryEventHandle);
        //    }

        //    //猫叫的事件的处理方法
        //    void CatCryEventHandle(object sender, CatCryEventArgs e)
        //    {
        //        WakeUp();
        //    }

        //    //主人被惊醒了的方法
        //    private void WakeUp()
        //    {
        //        Console.WriteLine(name + " is wakeup and cry 'Tom what are you doing ?'");
        //    }
        //}

        #endregion

        #region 老鼠

        //public class Mouse
        //{
        //    //老鼠名
        //    private string _name;

        //    //构造函数
        //    public Mouse()
        //    { }

        //    public Mouse(string name, Cat cat)
        //    {
        //        this._name = name;
        //        cat.CatCryEvent += new EventHandler<CatCryEventArgs>(CatCryHandleRun);
        //    }

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

        //    //老鼠跑的方法
        //    private void Run()
        //    {
        //        Console.WriteLine(_name + " is running !");
        //    }
        //}

        #endregion

        #endregion

        #region 通过抽象类完成,与接口完成类似

        //定义主动
        public abstract class Observer
        {
            //通知的方法
            public abstract void Notice(Reobj robj);
        }

        //定义接收
        public abstract class Reobj
        {
            public abstract void Show();
        }

        //定义主动者
        public class Cat : Observer
        {
            ArrayList al = new ArrayList();

            public override void Notice(Reobj robj)
            {
                al.Add(robj);
            }

            public void Cry()
            {
                Console.WriteLine("Tom 大喊一声!");
                foreach (Reobj o in al)
                {
                    o.Show();
                }
            }
        }

        //定义接收者
        public class Mouse : Reobj
        {
            public Mouse()
            { }
            public Mouse(Observer obs)
            {
                obs.Notice(this);
            }

            public override void Show()
            {
                Console.WriteLine("Jerry is running!");
            }
        }

        //定义Owner
        public class Owner : Reobj
        {
            public Owner()
            { }

            public Owner(Observer obs)
            {
                obs.Notice(this);
            }  

            public override void Show()
            {
                Console.WriteLine("主人醒了,大喊:Tom what are you doing?");
            }
        }

        #endregion
    }

  • 相关阅读:
    Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)
    Gym-101673 :East Central North America Regional Contest (ECNA 2017)(寒假自训第8场)
    Gym -102007 :Benelux Algorithm Programming Contest (BAPC 18) (寒假自训第5场)
    Gym .101879 USP Try-outs (寒假自训第七场)
    Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)
    Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)
    Gym .102021 .German Collegiate Programming Contest (GCPC 18) (寒假gym自训第三场)
    Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)
    【整理】简单的数学期望和概率DP
    猿助力下载地址
  • 原文地址:https://www.cnblogs.com/jasonjiang/p/1763448.html
Copyright © 2020-2023  润新知