设计模式之--Observer
来源:互联网 发布:java高级程序员证书 编辑:程序博客网 时间:2024/04/28 05:28
在设计一组对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用,它可以使对象的状态与它们所依赖的对象的状态保持同步。 Observer Pattern推荐采用发布者--订阅者(publisher--subscriber)模型,使这组观察者(Observer)和主题(Subject)对象之间有清晰的界限。比较直观的形式是“注册--通知--撤消注册”。下面描述这样一个过程:
1.Observer将自己注册到Subject中,Subject将Object存放在一个容器(Container)里。
2.Observer对象发生某种变化,从Container中得到所有注册过的Observer,将变化通知Object。
3.Object告诉Subject要撤消注册,Subject从Container中将Object除去。
为了实现这种机制主题需要为注册注销和通知提供一个接口。
//interface the all observer classes should implement
public interface IObserver
{
void Notify(object anObject);
}
1.Observer将自己注册到Subject中,Subject将Object存放在一个容器(Container)里。
2.Observer对象发生某种变化,从Container中得到所有注册过的Observer,将变化通知Object。
3.Object告诉Subject要撤消注册,Subject从Container中将Object除去。
为了实现这种机制主题需要为注册注销和通知提供一个接口。
//interface the all observer classes should implement
public interface IObserver
{
void Notify(object anObject);
}
//interface that all observable classes should implement
public interface IObservable
{
void Register(IObserver anObserver);
void UnRegister(IObserver anObserver);
}
public interface IObservable
{
void Register(IObserver anObserver);
void UnRegister(IObserver anObserver);
}
下面是具体实现:
public class ObservableImpl: IObservable
{
//container to store the observer instance
protected Hashtable _observerContainer=new Hashtable();
//add the observer
public void Register(IObserver anObserver)
{
_observerContainer.Add(anObserver,anObserver);
}
//remove the observer
public void UnRegister(IObserver anObserver)
{
_observerContainer.Remove(anObserver);
}
public class ObservableImpl: IObservable
{
//container to store the observer instance
protected Hashtable _observerContainer=new Hashtable();
//add the observer
public void Register(IObserver anObserver)
{
_observerContainer.Add(anObserver,anObserver);
}
//remove the observer
public void UnRegister(IObserver anObserver)
{
_observerContainer.Remove(anObserver);
}
//common method to notify all the observers
public void NotifyObservers(object anObject)
{
//enumeration the observers and invoke their notify method
foreach(IObserver anObserver in _observerContainer.Keys)
{
anObserver.Notify(anObject);
}
}
}
public void NotifyObservers(object anObject)
{
//enumeration the observers and invoke their notify method
foreach(IObserver anObserver in _observerContainer.Keys)
{
anObserver.Notify(anObject);
}
}
}
在 .NET 应用程序中可以使用这些构造,也可以引入委托和事件实现Observer Pattern,这样不必开发专用于支持该模式的特定类型。以下是一道关于Observer Pattern不错的练习题:
猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
要求:1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性。
要求:1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性。
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之--Observer
- 设计模式之--Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之Observer
- 设计模式之 observer
- 一个很有意义的计算题!
- 你真的了解.NET中的String吗?
- 关于Python的线程
- 你真的了解.NET中的String吗?
- 进一步了解String
- 设计模式之--Observer
- 设计模式之--Observer
- 设计模式之Observer
- StringBuilder的实现与技巧
- Session详解
- Exceptional C++ Style之2
- 两位民工的眼神让我感动一生
- crystal report初体验
- 用 CSS 实现的阴影效果