温故而知新
用观察者模式实现C#经典题目 猫叫鼠跑人骂
什么是设计模式里的观察者模式?我观察到楼下有西瓜卖,于是我就下楼买。同时也观察到楼下有西瓜卖,于是也下楼买西瓜。那么我和同事都是观察者,西瓜摊就是被观察对象。我们之间的关系就是通过观察(看到)就买。所以观察者模式有两种对象,观察者和被观察的对象。
回到题目,猫叫老鼠跑人骂。就相当于人和老鼠在观察猫喊的行为,只要猫一喊,老鼠就跑,只要猫一喊,人就骂。即老鼠和人是观察者,猫是被观察者。猫的动作是喊,老鼠的反应是跑,人的反应是骂,那么人和老鼠根据猫的动作都有反应,所以把反应response提取出来。
那么我们当前可以大概有个思路:
猫类 老鼠类:I反应 人:I反应 interface 观察者的反应
{ { { {
喊(){} 跑(){} 骂(){} response();
} } } }
-------------------------------------------------------------------------------------------------------------------------------------
猫叫鼠跑人骂直接如何关联呢?通过List<I反应>,由于都是观察猫才有相应的反应,所以把List<反应>放入猫类里,只要猫叫,就循环把人和老鼠的List<反应> 显示出来即可实现猫叫老鼠跑人骂的观察后做出反应的效果。
所以猫类要加入List<反应>:
猫类{ List<反应> observe;喊(){} },同时老鼠和人也在实例化时把自身加入到猫类的List<反应> 里。所以猫类还应该有个加入(注册)的方法让老鼠和人加入(注册)到List。那么我们可以得到第二版代码
猫类 老鼠类:I反应 人:I反应 interface 观察者的反应
{ { { {
List<I反应> 反应; 实例化(观察猫 cat) 实例化(观察猫 cat)
{ {
cat.添加反应(I反应); 添加反应(I反应);
} }
添加反应(I反应)
{
List.Add(I反应);
}
喊(){ 跑(){} 骂(){} response();
猫:喵喵喵;
foreach(List)
{显示反应情况}
}
} } } }
===================================================================================
基本是这个样子了,为了抽象,更实用,可能不是猫,是狗喊呢?人和老鼠也会有反应,所以我们应该把人和老鼠观察者猫添加(实例化)反应也抽象为接口,那么最后代码就是 多了一个被观察者(主体)的接口,ISubject;接口里的方法为加入(注册)老鼠,人的反应进反应列表。老鼠和人实例化 不在是(猫)而是主体接口 ISubject