下面代码是使用C#实现观察者模式的例子:
//“观察者”接口
public interface IObserver {
void Notify(object anObject);
}
//“被观察对象”接口
public interface IObservable {
void Register(IObserver anObserver);
void UnRegister(IObserver anObserver);
}
观察者和被观察对象都分别从这两个接口实现,所有的操作都是由这两个接口定义的,而不是具体的实现。所以观察者和被观察对象没有绑定在一起。我们可以方便的更改观察者和被观察对象的任意部分而不影响其他部分。
下面实现具体的被观察对象。下面的类是所有被观察对象的基类,实现了所有被观察对象都必须的方法。我们使用一个Hashtable作为观察者的容器。代码如下:
//所有被观察对象的基类
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);
}
}
}
上面的类不是最终要实现的被观察对象,而是所有被观察者的基类,其中实现了所有观察对象共有的功能。这个类可以干脆定义为abstract,使得程序员不可以创建其实例。接口以及实现这个接口的虚类既保持了类之间松散的耦合,又使多个具体实现可以使用相同的功能。
下面最终实现观察者模式,使用用户界面——业务数据作为例子:
//业务数据(被观察对象)
public class SomeData : ObservableImpl {
//被观察者中的数据
float m_fSomeValue;
//改变数据的属性
public float SomeValue {
set {
m_fSomeValue = value;
base.NotifyObservers(m_fSomeValue);//将改变的消息通知观察者
}
}
}
//用户界面(观察者)
public class SomeKindOfUI : IObserver {
public void Notify(object anObject){
Console.WriteLine("The new value is:" + anObject);
}
}
//实际调用的过程
public class MainClass{
public static void Main() {
//创建观察者和被观察者
SomeKindOfUI ui = new SomeKindOfUI();
SomeData data = new SomeData();
//在被观察对象中注册观察者
data.Register(ui);
//改变被观察对象中的数据,这时被观察者会通知观察者
data.SomeValue = 1000f;
//注销观察者,停止观察
stock.UnRegister(stockDisplay);
}
}
.NET中更好的实现方式
上面的形式是我们用一种最基本的方式实现了观察者模式,我们为观察者模式开发了一种特定的类型。在.NET框架中,使用代理以及事件,可以更好的实现观察者模式。C#中代理和事件的介绍可以看这一篇文章:在C#中使用代理的方式触发事件,里面有对代理和事件的详细描述,还有例程,这里就不多说了。在.NET支持的其他语言中也有各自的实现方式。
在事件的模式下,声明事件的类就是被观察者。被观察者不需要实现对观察者的注册,只需要公开一个事件,而不实行任何操作。被观察者也不需要将自己注册到观察对象中,而是要创建一个特定的代理的实例,将这个代理绑定到某个方法上。用这样的方式注册或者撤销观察者对观察对象的观察。仔细研究代理和事件的模式就不难发现,IObserver和IObservable接口的方法可以减少观察者和观察对象之间的耦合,而代理和事件几乎消除了这两个模块之间的耦合,灵活性提高了很多。
分享到:
相关推荐
委托实现C#观察者模式简单例子
接口实现C#观察者模式简单例子
vs2013工程 收集了几个简单易懂的C#观察者模式示例,均是控制带程序,可以直接运行看结果,代码中有注释
实现软件模式中的观察者模式,观察者观察对象的状态,当对象的状态发生变化时,将会打印发生变化的对象。简单的一个demo实例
本文以实例形式简单讲述了C#观察者模式,分享给大家供大家参考。具体实现方法如下: 现在假设有一个软件公司,每当有新产品推出,就把信息通知到一些客户。 把通知这个动作抽象成一个接口。代码如下所示: public ...
用C#实现观察者模式,能用的。。。。。。。。。。。。。。。。。。。。。。。
浅谈观察者模式及在C#中的实现 浅谈观察者模式及在C#中的实现
C#设计模式之观察者模式的应用实例。
最近正在学习C#中,自己做的一个基于工厂模式(包含抽象工厂)、观察者模式的小工程
观察者模式Demo,设计模式,观察者模式
该资源是C#不同窗体间的数据传递发布订阅模式(观察者模式)源码范例,资源很好,思路清晰,值得大家借鉴
.java文件。观察者模式的例子。可以运行,同时帮助理解观察者模式。
最简单观察者模式,同步数据、图表、值。。。 当主界面操作值变化,其他的观察者同步变化
观察者模式 观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在状态发生变化时,会通知所有观察者。当一个对象改变需要同时改变其他对象,而且他不知道具体有多少...
我想把C#中实现观察者模式的三个方案做一个总结,目前还没看到这样的总结 现在我们来假设这样的一个场景,并利用观察者模式实现需求: 场景:未来智能家居进入了每家每户,每个家居都留有API供客户进行...
C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式C#观察者模式
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
C#实现的基于观察者模式的事件机制,unity可用。分2个文件,事件和事件中心。事件中心保存有对所有事件(Observer)的引用,事件中心负责对这些事件进行分发,这样每个事件就可以通过回调函数的方式进行更新(传递...