用事件和观察者模式解决经典面向对象题目:猫叫鼠跑人醒的题目
2017-04-18 15:42
375 查看
猫看到老鼠,叫一声喵,老鼠听到猫叫,撒腿就跑,主人被吵醒
分析:
看题目可知道有3个对象,老鼠,猫和人,他们的关联就是猫叫-->老鼠跑-->主人被吵醒,
猫看到老鼠,激发了猫叫的事件
大致结构如下
public delegate void SubDelegate();
class Cat
{
如何通过事件来关联他们三者呢?
猫类 猫cry 引发事件
首先在初始化时挂载事件
老鼠类 和人 在初始化是传入猫类来挂载事件如
最后,在添加一个房子类,把猫,老鼠,人 都放入房子类里, 只要调用猫.Cry ,就会激发后续事件
完整代码如下
用设计模式中的观察者模式
猫是主体,老鼠和人在观察着猫,通过接口关联,初始化把主体也就是猫传入,然后添加到list<观察者> ,当调用猫的cry 就循环把list里面的观察者 的response
分析:
看题目可知道有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 ();
}
}
相关文章推荐
- Java面向对象方式(观察者模式)解决菲波拉契数列问题(兔子三岁后就可以生小兔子)
- C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题
- 对象间的联动——观察者模式与Java事件处理(五)
- 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象
- 浅谈面向对象设计模式:观察者模式
- [导入]C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式.zip(10.27 MB)
- JS面向对象经典题目(一)
- php 面向对象开发中的观察者模式介绍
- 面向对象设计模式--观察者模式(Observer)
- 一道经典的面向对象题目的JAVA实现
- 关于面向对象和观察者模式
- Android编程思想,面向对象程序设计第三篇——观察者模式
- 面向对象设计模式之一观察者模式
- 面向对象设计模式之---观察者模式(Observer Pattern)
- 面向对象程序设计(OOP设计模式)-行为型模式之观察者模式的应用与实现
- C#面向对象模式设计第十九讲:Observer 观察者模式(行为型模式)
- 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象
- 设计模式学习笔记二:面向对象基础六之委托与事件
- 观察者模式经典例子(猫叫)
- 面向对象题目,经典点的(java的 也可以用c#做下)