故事
在這樣一個簡單的故事場景中我們發現了什麼?來看看小雪和男孩們的煩惱
男孩們必須不斷的詢問小雪的位置變化
小雪也要不斷的接受男孩們的詢問
如果給各個男孩們回復問題的方式都不盡相同
看到這麼多煩惱
觀察者模式的解決方案
帶著這個定義我們來看看嘗試實現上面的觀察者模式
首先在觀察者模式中我們必須定義一個所有
//所有觀察者都必須實現
public interface IBoy
{
void Show(string address);
}
using System;
//男孩A
public class BoyA : IBoy
{
public void Show(string address)
{
//假設經過處理後為韓文的地址
Console
}
}
using System;
//男孩B
public class BoyB : IBoy
{
public void Show(string address)
{
Console
}
}
下面看看小雪的實現
using System;
using System
public class GPRSMobile
{
//保存一個觀察者列表
private List<IBoy> boys = null;
private string address =
public GPRSMobile()
{
boys = new List<IBoy>();
}
//添加觀察者
public void AddBoy(IBoy b)
{
boys
}
public void RemoveBoy(IBoy b)
{
boys
}
//通知
private void Notify(string address)
{
for (int i =
{
boys[i]
}
}
//位置發生變化
public void OnAddressChanaged(string newAddress)
{
//假設這裡的地址是中文形式的
Notify(newAddress);
}
}
那觀察者模式到底有哪些好處呢?在上面的例子中我們可以看到被觀察者僅僅依賴於一個實現了觀察者接口的列表
在上面的描述中我們仿佛看到了面向接口編程無窮的力量
中的觀察者模式
中
在Gof的觀察者模式中(姑且稱之為經典設計模式吧)
public class Program
{
static void Main(string[] args)
{
Console
int input = Console
if (input <
{
Console
}
for (int i =
{
if (i == input)
{
//屏幕輸出
Console
//彈出提示框
MessageBox
//可能還有其他處理
}
}
}
}
看到這個例子有什麼感覺?
循環的代碼和處理的代碼混在一起
namespace Observer
{
//定義一個委托
public delegate void NumberEventHandler(object sender
//要傳遞哪些參數到觀察者?在這裡定義
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 =
{
//觸發事件的條件到了
if (i == number)
{
NumberEventArgs e = new NumberEventArgs(i);
OnNumberReached(e);
}
}
}
//注意
//甚至可以不觸發事件
protected virtual void OnNumberReached(NumberEventArgs e)
{
//判斷事件是否為null
if (NumberReached != null)
NumberReached(this
}
}
public class MainProgram
{
public static void Main()
{
Console
int input = Console
if (input <
{
Console
}
Subject s = new Subject();
//給事件綁定方法
s
MainProgram mp = new MainProgram();
//給事件綁定方法
s
s
Console
}
void console_NumberReached(object sender
{
Console
}
static void msgbox_NumberReached(object sender
{
MessageBox
}
}
}
雖然這個例子代碼多多了
總結
有人說中國的數學教育是個錯誤
本來上面的文章已經寫定了
From:http://tw.wingwit.com/Article/program/net/201311/11302.html