用观察者模式和委托写一个兔子跑狮子追的例子,看看他们的特点(委托是个类,事件是委托的一个实例,事件存在时是个方法的指针)
流程:
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);
}
}