namespace Observer
{
//定義一個委托,這裡定義了觀察者方法的簽名,就是一個協議吧
public delegate void NumberEventHandler(object sender,NumberEventArgs e);
//要傳遞哪些參數到觀察者?在這裡定義,注意,要繼承自EventArgs
public class NumberEventArgs : EventArgs
{
public NumberEventArgs(int number)
{
_number = number;
}
private int _number;
public int Number
{
get { return _number; }
set { _number = value; }
}
}
//觀察者模式中的主題
public class Subject
{
//定義一個事件,就是委托的實例了
public event NumberEventHandler NumberReached;
public void DoWithLoop(int number)
{
for (int i = 0; i <= 100; i++)
{
//觸發事件的條件到了
if (i == number)
{
NumberEventArgs e = new NumberEventArgs(i);
OnNumberReached(e);
}
}
}
//注意,這個方法定義為保護的,虛擬的,代表子類還可以進行覆蓋,改變觸發事件的行 為
//甚至可以不觸發事件 protected virtual void OnNumberReached(NumberEventArgs e)
{
//判斷事件是否為null,也就是是否綁定了方法
if (NumberReached != null) NumberReached(this, e);
}
}
public class MainProgram
{
public static void Main()
{
Console.WriteLine("Please Input a 0-100 Number:");
int input = Console.Read();
if (input < 0 || input > 100) { Console.WriteLine("Error"); }
Subject s = new Subject();
//給事件綁定方法,靜態的
s.NumberReached += new NumberEventHandler(msgbox_NumberReached);
MainProgram mp = new MainProgram();
//給事件綁定方法,實例方法
s.NumberReached += new NumberEventHandler(mp.console_NumberReached);
s.DoWithLoop(input); Console.Read();
}
void console_NumberReached(object sender, NumberEventArgs e)
{
Console.WriteLine(e.Number.ToString());
}
static void msgbox_NumberReached(object sender, NumberEventArgs e)
{
MessageBox.Show(e.Number.ToString());
}
}
}