1. 程式人生 > >用事件和觀察者模式解決經典面向物件題目:貓叫鼠跑人醒的題目

用事件和觀察者模式解決經典面向物件題目:貓叫鼠跑人醒的題目

貓看到老鼠,叫一聲喵,老鼠聽到貓叫,撒腿就跑,主人被吵醒

分析: 

      看題目可知道有3個物件,老鼠,貓和人,他們的關聯就是貓叫-->老鼠跑-->主人被吵醒, 

      貓看到老鼠,激發了貓叫的事件

大致結構如下

public delegate void SubDelegate();
class Cat
{
public event SubDelegate alertEvent;  //事件
alert()//貓叫
{ 
    console.writeLine("貓:喵喵喵,老鼠哪裡跑!!!");
}
}
class Master
{
wake() //人醒
{   
   console.writeLine("主人:吵什麼,貓咪!!!");
}
}
class Mouse
{
Run()  //老鼠跑
 {
  console.writeLine("老鼠:趕緊跑,有貓!!!");
 }
}

如何通過事件來關聯他們三者呢?

貓類 貓cry 引發事件

首先在初始化時掛載事件

  public Cat()
        {
            alerEvent += new SubDelegate(alert);
        }
同時再新增一個cry()的方法用於引發事件 alerEvent();
老鼠類 和人 在初始化是傳入貓類來掛載事件如
        public Mouse(Cat c)
        {
            c.alerEvent += new SubDelegate(Run);
        }


 最後,在新增一個房子類,把貓,老鼠,人 都放入房子類裡, 只要呼叫貓.Cry ,就會激發後續事件  完整程式碼如下
 public delegate void SubDelegate();
    public class Cat
    {
        public event SubDelegate alerEvent;
        public Cat()
        {
            alerEvent += new SubDelegate(alert);
        }
        public void alert()
        {
            Console.WriteLine("貓咪:喵喵喵");
        }
        public void cry()
        {
            alerEvent();
        }

    }
    public class Mouse
    {
        public Mouse(Cat c)
        {
            c.alerEvent += new SubDelegate(Run);
        }

       

        public void Run()
        {
            Console.WriteLine("老鼠:貓來了,快跑啊");
        }
    }
    public class Master
    {
        public Master(Cat c)
        {
            c.alerEvent += new SubDelegate(wake);
        }
        public void wake()
        {
            Console.WriteLine("主人:吵撒子");
        }
    }
    public class House
    {
        public Cat c;
        public Mouse m;
        public Master master;
        public House()
        {
            c = new Cat();
            m = new Mouse(c);
            master = new Master(c);

        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            House h = new House();
            h.c.cry();
            Console.Read ();


        }
    }

用設計模式中的觀察者模式  貓是主體,老鼠和人在觀察著貓,通過介面關聯,初始化把主體也就是貓傳入,然後新增到list<觀察者> ,當呼叫貓的cry 就迴圈把list裡面的觀察者 的response 
    public interface IObserver
    {
        void Response();
    }
    public interface ISubject
    {
        void Register(IObserver obs);
        
    }

    public class Cat:ISubject
    {
        List<IObserver> list;
        public Cat()
        {
            list = new List<IObserver>();
        }
        public void Register(IObserver obs)
        {
            list.Add(obs);
        }

        public void cry()
        {
            Console.WriteLine("貓:喵喵喵,老鼠哪裡跑");

            foreach (IObserver i in list)
            {
                i.Response();
            }

        }
    }
    public class Master :IObserver
    {
        public Master(ISubject sub)
        {
            sub.Register(this);
        }
        public void Response()
        {
            Console.WriteLine("主人:吵什麼,貓咪");
        }
    }
    public class Mouse:IObserver
    {
        public Mouse(ISubject sub)
        {
            sub.Register(this);
        }
        public void Response()
        {
            Console.WriteLine("老鼠:快跑,有貓");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Cat c = new Cat();
            Mouse mouse = new Mouse(c);
            Master master = new Master(c);
            c.cry();
            Console.Read ();

        }
    }