用事件和觀察者模式解決經典面向物件題目:貓叫鼠跑人醒的題目
阿新 • • 發佈:2019-02-09
貓看到老鼠,叫一聲喵,老鼠聽到貓叫,撒腿就跑,主人被吵醒
分析:
看題目可知道有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 ();
}
}