日期:2014-05-19  浏览次数:20823 次

面试了一道在CSDN上贴过的题,后悔并散分着
昨天用公司通知我去复试
不知道为啥还要做题......
看到有一个关于设计模式的题目:
描述:猫大叫一声,所有老鼠开始逃跑,主人被惊醒
A)要有联动性 老鼠与主人的行为是被动的
B)考虑扩展性,猫的叫声可能引起其他的联动效应


我晕,想起来以前在CSDN上有人贴出过,还有很多牛人写了自己的答案
那时感觉自己还嫩着,不可能遇到这样的题,结果昨天.....
现在终于知道什么叫后悔了,唉,还有知道的么?以前的题我找不到了,谢谢!
感觉平时看贴也是要好好总结的,面试什么的没准用的着。

------解决方案--------------------
public interface Observer
{
void Response(); //观察者的响应,如是老鼠见到猫的反映
}
public interface Subject
{
void AimAt(Observer obs); //针对哪些观察者,这里指猫的要扑捉的对象---老鼠
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject subj)
{
this.name = name;
subj.AimAt(this);
}

public void Response()
{
Console.WriteLine(name + " attempt to escape! ");
}
}
public class Master : Observer
{
public Master(Subject subj)
{
subj.AimAt(this);
}

public void Response()
{
Console.WriteLine( "Host waken! ");
}
}

public class Cat : Subject
{
private ArrayList observers;
public Cat()
{
this.observers = new ArrayList();
}
public void AimAt(Observer obs)
{
this.observers.Add(obs);
}
public void Cry()
{
Console.WriteLine( "Cat cryed! ");
foreach (Observer obs in this.observers)
{
obs.Response();
}
}
}
class MainClass
{
static void Main(string[] args)
{
Cat cat = new Cat();
Mouse mouse1 = new Mouse( "mouse1 ", cat);
Mouse mouse2 = new Mouse( "mouse2 ", cat);
Master master = new Master(cat);
cat.Cry();
}
}


//---------------------------------------------------------

设计方法二: 使用event -- delegate设计..
public delegate void SubEventHandler();
public abstract class Subject
{
public event SubEventHandler SubEvent;
protected void FireAway()
{
if (this.SubEvent != null)
this.SubEvent();
}
}
public class Cat : Subject
{
public void Cry()
{
Console.WriteLine( "cat cryed. ");
this.FireAway();
}
}
public abstract class Observer
{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHandler(Response);
}
public abstract void Response();
}
public class Mouse : Observer
{
private string name;
public Mouse(string name, Subject sub) : base(sub)
{
this.name = name;
}
public override void Response()
{
Console.WriteLine(name + " attempt to escape! ");
}
}
public class Master : Observer
{
public Master(Subject sub) : base(sub){}
public override void Response()
{