您的位置:首页 > 其它

用事件和观察者模式解决经典面向对象题目:猫叫鼠跑人醒的题目

2017-04-18 15:42 375 查看
猫看到老鼠,叫一声喵,老鼠听到猫叫,撒腿就跑,主人被吵醒

分析: 

      看题目可知道有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 ();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息