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

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - 空中的风月

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);
}

}