程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#實現Observer觀察者模式

C#實現Observer觀察者模式

編輯:關於C語言
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());
 }
}
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved