用觀察者模式和委託寫一個兔子跑獅子追的例子,看看他們的特點(委託是個類,事件是委託的一個執行個體,事件存在時是個方法的指標)
流程:
1.一個獅子,和一個兔子(可以多個委託和觀察者都可以是多個)
2.獅子和兔子互相看到了
3.兔子開始跑
4.獅子開始追
一。委託的例子
程式流程
1.定義一個跑的委託(跑是自然規律之一,人拿槍來了獅子也得跑,是通用的,委託實際就是方法的介面類)
2.兔子類:
(1).跑的一個執行個體事件,兔子自己跑的行為
(2).兔子跑的行為方法
3.獅子類:
(1).獅子追的行為方法
4.情境類(就是頁面)
(1).有個兔子
(2).有個獅子
(3).獅子和兔子見面情境
(4).兔子跑事件發生會引發獅子追(如果看見了,引發)
public partial class Default2 : System.Web.UI.Page
{
兔子 兔子1 = new 兔子();
獅子 獅子1 = new 獅子();
protected void Page_Init(object sender, EventArgs e)
{
兔子1.兔子跑事件 += new 跑(獅子1.追);//是否在這個情境互相看見了,如果看見了,註冊這代碼,這個代碼的實質是把獅子的“追”方法指標告訴“兔子跑事件”
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void 獅子和兔子互相看到了_Click(object sender, EventArgs e)//一個button事件
{
兔子1.我跑了();
}
}
public delegate void 跑(string 跑的東西);
public class 兔子
{
public event 跑 兔子跑事件;
public void 我跑了()
{
開始跑();
}
private void 開始跑()
{
if (兔子跑事件 != null)//如果被獅子看見了,如果沒看見,就不通知獅子了,自己隨便跑著玩,沒人追(其實就是註冊的代碼)
{
兔子跑事件("兔子1");
}
}
}
public class 獅子
{
public void 追(string 跑的東西)
{
System.Web.HttpContext.Current.Response.Write("全國都解放了" + 跑的東西 + "你往那跑");
}
}
二。觀察者例子
//“觀察者”介面
public interface IObserver
{
void Notify(object anObject);
}
//“被觀察對象”介面
public interface IObservable
{
void Register(IObserver anObserver);
void UnRegister(IObserver anObserver);
}
//所有被觀察對象的基類
public class ObservableImpl : IObservable
{
//儲存觀察對象的容器
protected Hashtable _observerContainer = new Hashtable();
//註冊觀察者
public void Register(IObserver anObserver)
{
_observerContainer.Add(anObserver, anObserver);
}
//撤銷註冊
public void UnRegister(IObserver anObserver)
{
_observerContainer.Remove(anObserver);
}
//將事件通知觀察者
public void NotifyObservers(object anObject)
{
//枚舉容器中的觀察者,將事件一一通知給他們
foreach (IObserver anObserver in _observerContainer.Keys)
{
anObserver.Notify(anObject);
}
}
}
//業務資料(被觀察對象)
public class SomeData : ObservableImpl
{
//被觀察者中的資料
float _askPrice;
//改變資料的屬性
public float AskPrice
{
set
{
_askPrice = value;
base.NotifyObservers(_askPrice);//將改變的訊息通知觀察者
}
}
}
//使用者介面(觀察者)
public class SomeKindOfUI : IObserver
{
public void Notify(object anObject)
{
Console.WriteLine("The new ask price is:" + anObject);
}
}
//實際調用的過程
public class MainClass
{
public static void Main()
{
//建立觀察者和被觀察者
SomeKindOfUI ui = new SomeKindOfUI();
SomeData data = new SomeData();
//在被觀察對象中註冊觀察者
data.Register(ui);
//改變被觀察對象中的資料,這時被觀察者會通知觀察者
data.AskPrice = 1000f;
//登出觀察者,停止觀察
data.UnRegister(ui);
}
}