下面代码是使用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#观察者模式实例: 1. **定义委托** 首先,我们需要定义一个委托类型,表示观察者应该执行的操作。例如: ```csharp public delegate void StateChangedEventHandler(object ...
vs2013工程 收集了几个简单易懂的C#观察者模式示例,均是控制带程序,可以直接运行看结果,代码中有注释
观察者模式是软件设计模式中的一种行为模式,它在面向对象编程中扮演着重要的角色,尤其是在C#这样的语言中。观察者模式的核心思想是定义一个一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象...
在C#编程中,观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。这个模式广泛应用于事件驱动编程,例如GUI系统、多线程通信等...
在C#中,观察者模式允许一个对象(称为主题或被观察者)在状态发生改变时,自动通知所有依赖它的观察者对象。这种模式遵循“发布/订阅”原则,即观察者订阅某个主题,然后在主题的状态变化时,接收通知并执行相应的...
在C#中,我们可以利用.NET框架提供的事件和委托机制来实现观察者模式。本文将深入探讨如何使用C#来实现这一模式。 首先,我们需要理解观察者模式的基本组件:主题(Subject)和观察者(Observer)。主题是被观察的...
本文以实例形式简单讲述了C#观察者模式,分享给大家供大家参考。具体实现方法如下: 现在假设有一个软件公司,每当有新产品推出,就把信息通知到一些客户。 把通知这个动作抽象成一个接口。代码如下所示: public ...
### 观察者模式及其在C#中的应用 #### 观察者模式的目的与概述 观察者模式(Observer Pattern)是一种行为设计模式,其主要目的是解决面向对象设计中常见的问题——如何实现对象间的解耦,使得一个对象的状态改变...
在C#中,我们可以利用.NET框架提供的事件和委托机制来实现观察者模式。 在给定的文件列表中,我们看到以下几个关键文件: 1. AllyControlCenter.cs:这可能是控制盟友(Ally)行为的类,它可能包含了被观察的状态或...
在这个名为"C# 工厂和观察者模式的小工程"中,我们可以深入探讨这两种模式及其在实际项目中的应用。 首先,让我们来看看工厂模式。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在当实例...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动编程,使得多...
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象事件发生时通知多个“观察”该对象的其他对象。在Java、C#等面向对象编程语言中,这种模式广泛应用于数据绑定和事件处理,...
本资源重点探讨的是发布订阅模式(也称为观察者模式)在C#窗体间数据传递的应用。 发布订阅模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...
**C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...
在C#中,观察者模式有多种实现方式,包括.NET框架内置的Event模型、使用IObservable和IObserver接口以及Action函数式方案。下面我们将详细介绍这三种实现方式。 1. 利用.NET的Event模型来实现 .NET的Event模型是最...
而在其他语言中,如C#、Python等,也可以轻松实现观察者模式,通过事件或委托机制。 总结来说,观察者模式是一种重要的设计模式,它允许对象在状态改变时自动通知其他对象,从而降低了系统各部分之间的耦合度,提高...