觀察者模式

萝らか妹 提交于 2020-04-08 13:10:01

觀察者模式實際上就是發布訂閱模式.即可以進行推操作與拉操作.比如SQL Server或IBM MQ Sphere的發布訂閱方式.

對於推操作,就是對於訂閱者,由系統一些性推給訂閱者.一般是不分好壞,全都發. 對於基礎數據的發布操作使用這個操作是相當好的.

對於拉操作,就是被訂閱者通過一個接口,把訂閱的資料上在上面,而由訂閱者自行拉到.

例子1:

下面事例使用推操作方式操作得到.

//“观察者”接口
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;

//注销观察者,停止观察
stock.UnRegister(stockDisplay);
}

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!