惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
J
Java Code Geeks
S
SegmentFault 最新的问题
L
LangChain Blog
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
MongoDB | Blog
MongoDB | Blog
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
H
Help Net Security
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
N
Netflix TechBlog - Medium
A
About on SuperTechFans
博客园 - 叶小钗
美团技术团队
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net

博客园 - 空中的风月

EJB 简介 MyBatis 简介 Hibernate 简介 Struts2 简介 Spring MVC简介 WebLogic中的一些基本概念 浅谈WebLogic和Tomcat Tomcat安装配置 由少林寺比武想到软件行业分工 SQLServer硬件性能监控列表 数据库方面面试问题 JAVA程序员面试32问 C#常看面试问题以及解答 在做物流的库存管理系统里,需要注意。。。。。 在写自动更新程序中出现的问题 项目管理中可能有的问题,以及如何去面对! 数据库设计中的五个范式 关于软件自动升级程序的设计方法 打印联纸报表时,出现每页都向下跳一点的问题?
觀察者模式
空中的风月 · 2007-11-15 · via 博客园 - 空中的风月

觀察者模式實際上就是發布訂閱模式.即可以進行推操作與拉操作.比如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);
}

}