对付老鼠哪种放猫叫对老鼠有用吗最有用

老鼠听到猫叫,立即躲入洞里是什么现象
条件反射现象
为您推荐:
其他类似问题
因为在很久以前的时候 老鼠的祖先就怕猫 体内便有这种基因 一直遗传到现在,所以老鼠听到猫叫就躲进洞里
老鼠无论听到什么大的声音 都会很害怕
扫描下载二维码面试题:猫叫、老鼠跑、人醒的一点看法 - simfe - 博客园
这些天一直在面试中,做着不同的面试题,唉,悲催
上周做的一道面试题今天正好出现在园里的首页,看了一下这位同学的实现,基本上方向是对的,就是代码上细节没有注意,有一些错误,这里我就写一下我的理解
---------------------------
C#面试题:
猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
1、要有联动性,老鼠和人的行为是被动的
2、考虑可扩展行,猫叫声可能会引起其他联动效应
&-------------
步骤1:先提取出对象,猫、老鼠、人(Cat,Mouse,Person)
步骤2:再提取对象的动作,猫叫、老鼠跑、人醒(Cat.Call,Mouse.Run,Person.Wake)
步骤3:关联关系,
这里有两种理解
1)& 猫叫-&老鼠跑
猫叫-&人醒
2)& 猫叫-&老鼠跑-&人醒(多级联动)
步骤4:很明显,对应c#这里可以直接使用委托链和事件实现
另外可以使用设计模式中的观察者模式
------------------------------------------
以下分别给出对应代码:
观察者模式:这里的老鼠有两种实现方式,对应步骤3中的关联关系
1 //观察者
2 public interface IObserver
void Update(ISubject sub);
1 //被观察者
2 public interface ISubject
void Notify();
void AddObserver(IObserver o);
void RemoveObserver(IObserver o);
2 public class Cat:ISubject
//缓存自己的观察者
private System.Collections.Generic.List&IObserver& _
public Cat()
_list=new System.Collections.Generic.List&IObserver&();
//通知所有自己得观察者
public void Notify()
foreach(IObserver o in
o.Update(this);
public void AddObserver(IObserver o)
_list.Add(o);
public void RemoveObserver(IObserver o)
_list.Remove(o);
//猫叫的时候通知观察者
public void Call()
System.Console.WriteLine("Cat Call");
1 //这里对应步骤3中关联关系的第一种理解
2 //猫叫-&老鼠跑
3 //猫叫-&人醒
5 public class Mouse:IObserver
public void Update(ISubject sub)
public void Run()
System.Console.WriteLine("Mouse Run");
1 //这里对应步骤3中关联关系的第二种理解
2 //猫叫-&老鼠跑-&人醒
3 //这里老鼠是猫的观察者,同时被人观察,所以两个接口都实现
4 public class MouseA:IObserver,ISubject
//实现观察者接口
public void Update(ISubject sub)
//注意,这里当猫通知老鼠后,老鼠要接着改变自己得状态,并通知自己得观察者
public void Run()
System.Console.WriteLine("MouseA Run");
//这里老鼠的跑动通知观察者
#region//实现被观察者接口
private System.Collections.Generic.List&IObserver& _
public MouseA()
_list=new System.Collections.Generic.List&IObserver&();
public void Notify()
foreach(IObserver o in
o.Update(this);
public void AddObserver(IObserver o)
_list.Add(o);
public void RemoveObserver(IObserver o)
_list.Remove(o);
#endregion
public class Person:IObserver{
public void Update(ISubject sub)
public void Wake()
System.Console.WriteLine("People Wake");
调用方法:
对应第一种:猫同时有两个观察者,或更多个,只需要调用AddObserver加入就行了
public static void Main()
//被观察者
ISubject c=new Cat();
IObserver m=new Mouse();
IObserver p=new Person();
//加入观察者
c.AddObserver(m);
c.AddObserver(p);
//被观察者状态改变
((Cat)c).Call();
对应第二种,猫有老鼠一个观察者,老鼠也有人一个观察者,多级联动关系
1 public static void Main()
//被观察者
ISubject c=new Cat();
//既是观察者,也是被观察者
IObserver m=new MouseA();
//加入观察者
c.AddObserver(m);
IObserver p=new Person();
//加入观察者
((ISubject)m).AddObserver(p);
//被观察者状态改变
((Cat)c).Call();
设计模式的使用最大的好处是,解耦合,
这位同学的观察者模式用的是没有错误的,但是代码中有问题,主要是Mouse和Peolple的构造函数中的参数,直接使用了Cat这个对象,这样就使得Mouse、Peolple与Cat绑死在一起,这里的Cat应该换成接口Subject
&-----------------------------以下使用事件和委托实现相同的功能,分为三种实现,第一种是单纯的类,并未解耦合,第二种使用接口解耦合,第三种使用抽象类
1 public delegate void NotifyEventHandler(object sender,EventArgs e);
3 public class TCat
public event NotifyEventHandler OnN
public void DoOnNotify(EventArgs e)
if (OnNotify!=null)
OnNotify(this,e);
public void Call()
System.Console.WriteLine("TCat Call");
EventArgs e=new EventArgs();
DoOnNotify(e);
20 public class TMouse
private TCat _C
public TMouse(TCat c)
c.OnNotify+=new NotifyEventHandler(OnMouseRun);
void OnMouseRun(object sender,EventArgs e)
public void Run()
System.Console.WriteLine("TMouse Run");
39 public class TPeople
private TCat _C
public TPeople(TCat c)
c.OnNotify+=new NotifyEventHandler(OnPeopleWake);
void OnPeopleWake(object sender,EventArgs e)
public void Wake()
System.Console.WriteLine("TPeople Wake");
使用方法:
1 public static void Main3()
TCat c=new TCat();
TMouse m=new TMouse(c);
TPeople p=new TPeople(c);
事件的第二种实现:
1 public interface INofify
event NotifyEventHandler OnN
6 public delegate void NotifyEventHandler(object sender,EventArgs e);
8 public class CCat:INofify
public event NotifyEventHandler OnN
public void DoOnNotify(EventArgs e)
if (OnNotify!=null)
OnNotify(this,e);
public void Call()
System.Console.WriteLine("CCat Call");
EventArgs e=new EventArgs();
DoOnNotify(e);
25 public class CMouse:INofify
private INofify _C
public CMouse(INofify c)
c.OnNotify+=new NotifyEventHandler(OnMouseRun);
void OnMouseRun(object sender,EventArgs e)
public void Run()
System.Console.WriteLine("CMouse Run");
EventArgs e=new EventArgs();
DoOnNotify(e);
public event NotifyEventHandler OnN
public void DoOnNotify(EventArgs e)
if (OnNotify!=null)
OnNotify(this,e);
53 public class CPeople
private INofify _C
public CPeople(INofify c)
c.OnNotify+=new NotifyEventHandler(OnPeopleWake);
void OnPeopleWake(object sender,EventArgs e)
public void Wake()
System.Console.WriteLine("CPeople Wake");
使用方法:
1 public static void Main()
INofify c=new CCat();
INofify m=new CMouse(c);
CPeople p=new CPeople(m);//注意,这里的Peolple并未实现INotify接口,如果需要实现步骤3中的更多级级联,请实现这个接口
((CCat)c).Call();
&事件的第三种实现:
1 ////Notify
2 public abstract class Notify
public event NotifyEventHandler OnN
public void DoOnNotify(EventArgs e)
if (OnNotify!=null)
OnNotify(this,e);
//这里是缓存被观察者
public Notify(Notify c)
if (c!=null)
_subject=c;
_subject.OnNotify+=new NotifyEventHandler(Do);
public abstract void Do(object sender,EventArgs e);
25 public class ACat:Notify
26 {//注意,这里由于继承于抽象类,所以必须要由一个Do函数的实现,函数体为空就可以了,要么就把抽象类的抽象函数改成virtual的
public ACat(Notify c):base(c)
public void Call()
System.Console.WriteLine("ACat Call");
EventArgs e=new EventArgs();
DoOnNotify(e);
38 public class AMouse:Notify
public AMouse(Notify c):base(c)
public override void Do(object sender,EventArgs e)
public void Run()
System.Console.WriteLine("AMouse Run");
EventArgs e=new EventArgs();
DoOnNotify(e);
55 public class APeople:Notify
public APeople(Notify c):base(c)
public override void Do(object sender,EventArgs e)
public void Wake()
System.Console.WriteLine("APeople Wake");
public static void Main()
//不需要被观察者
Notify cat=new ACat(null);
Notify mouse=new AMouse(cat);
//观察老鼠
Notify people=new APeople(mouse);
((ACat)cat).Call();
以上各种代码,区别在于使用模式和事件,或者是接口和抽象类,或者是扩展性的区别,另外使用的时候都是非常简单的,几行代码而已。
还有这位同学的实现,从结果上是正确的,但是缺点也很明显
1)各个类之间毫无结构性的关联,没有充分利用面向对象的一些特性,扩展性很差
2)尤其是调用代码部分,感觉很别扭对付老鼠[关闭讨论]|掌上红豆
> 查看帖子
对付老鼠[关闭讨论](回复:21/687)
家里晚上有一两只老鼠骚扰,大家说说方法
捉住搞干锅,二两烧酒送下肚!
下个老鼠惨叫音频,放给老鼠听,我用这招成功滴赶走柴房滴老鼠
k7s5a:下个老鼠惨叫音频,放给老鼠听,我用这招成功滴赶走柴房滴老鼠是真的咩?有更好用?呵呵
买那种沾老师的贴啊...老鼠夹也得啊...不然&&养只猫...
我家有一个只老鼠进门,可大胆啦,和我对视好久,最后我用鞋子把它给打死。
k7s5a:下个老鼠惨叫音频,放给老鼠听,我用这招成功滴赶走柴房滴老鼠那还不如下载一段猫叫的音频,反复播放
如若相知:我家有一个只老鼠进门,可大胆啦,和我对视好久,最后我用鞋子把它给打死。凶兆!
Hongkong唔开心:家里晚上有一两只老鼠骚扰,大家说说方法先把老鼠撵到卫生间或者东西比较少的房间再关上门,然后你在里面慢慢地打死老鼠。反正我一直用这个方法,不知道对你怎么样。
不熄的灯:先把老鼠撵到卫生间或者东西比较少的房间再关上门,然后你在里面慢慢地打死老鼠。反正我一直用这个方法,不知道对你怎么样。老鼠精得很,它往往跑到有掩体的空间和你展开拉锯战。
自撸排毒:老鼠精得很,它往往跑到有掩体的空间和你展开拉锯战。这就需要几个人的合作了,先关上有东西比较多的房间门,一个人在有有东西比较多的地方守着不给老鼠过来,开着卫生间的门,然后几个人一起把老鼠撵到卫生间就慢慢打死老鼠了。
养条狗,狗肉老鼠肉一起得吃。
拿麻包装它,我经常用这个方法
和平共处吧。阿米托福
买个超声波驱鼠器,顶有效的啵!注意:只是驱,不是灭啵!!!
我曾经不堪其扰,老鼠甚至跑进冰箱底部躲起来。粘鼠板只能粘住小老鼠,大的老鼠根本不上当,而且也能跑走。通常老鼠还会从原路往返。把老鼠赶进东西少的地方(如卫生间)关门打,但我用得最多的办法是,在入口处放老鼠药,让它吃了死在外面。然后堵住入口,亡羊补牢。
我家住4楼,13年家里窗口细纱网挨它咬破,进家发展势力,形成一个庞大的老鼠家族。老鼠夹试过,得个把,铁笼试过,也是得一两个。最后我买电猫回来,在每个房间门口离地3~5CM各布两根线。黑灯后我躺在沙发观察,发现老鼠进出房间门都是一跃而过。最后我的对付方法是,纱窗用粗网补上,家里食品收好,垃圾不留。大概过了半个月,发现老鼠全跑光,是从卫生间吊顶上面的木头窗口挖窿逃跑的,然后堵窿,太平!
市场上的哪个抓鼠笼,不知道有用嘛?还有那个老天天走市场“科学家不种地,专门研究高科技,老鼠吃了跑出外面死……”啊!
回复内容(换行请输入/// ):
长按以下链接复制本帖地址,然后分享给好友
掌上红豆 &2015怎么对付老鼠最好?_百度知道猫和老鼠有一些开头是猫叫两声然后老鼠擤鼻涕,那个是什么_百度知道

参考资料

 

随机推荐