觀察者模式Java版 http://blog.csdn.Net/nyzhl/archive/2007/12/09/1926130.ASPx
在Java中實現觀察者模式,需要在被觀察者中持有所有觀察者的引用,這樣觀察者和被觀察對象之間存在一定的耦合,只有實現觀察者接口的類的對象才可以注冊到被觀察者中,不夠靈活。
也許是我在吹毛求疵,因為Java已經做的很好了,但是在C#中,有更好的解決方法-Deleget & Event 。
被觀察對象不再需要持有觀察者的引用,只需要定義一個事件,而委托 事件是與類型無關的,它可以指向任意類的某個函數(當然要符合委托的返回值,參數聲明),非常靈活,消除了觀察者和被觀察對象的耦合。
還是昨天的例子:鬧鐘(被觀察對象)響(發送消息),人(觀察者)被驚醒(做出響應)。
using System;
//委托聲明
public delegate void AlarmHandler();

public class AlarmClock ...{
//事件聲明
private event AlarmHandler AlarmEvent;

public void Alarm() ...{
//事件觸發
if(AlarmEvent!=null) ...{
AlarmEvent();
}
}
//觀察者注冊
public void Registry(Person p) ...{
//事件隊列的注冊
this.AlarmEvent += new AlarmHandler(p.Wake);
}
}

public class Person ...{
private string _name;

public Person(string name) ...{
this._name = name;
}

public void Wake() ...{
Console.WriteLine(this._name + " is awake");
}
}

public class Test ...{

public static void Main() ...{
AlarmClock clock = new AlarmClock();
Person nyzhl = new Person("Zhao Hongliang");
Person Bob = new Person("Bob");
Person Jenny = new Person("Jenny");
clock.Registry(nyzhl);
clock.Registry(Bob);
clock.Registry(Jenny);
clock.Alarm();
}
}Zhao Hongliang is awake