C# 设计模式系列教程-观察者模式

yizhihongxing

C# 设计模式系列教程-观察者模式

什么是观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,主要用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都会得到通知并自动更新。观察者模式又被称为发布-订阅模式。

观察者模式实现分析

在观察者模式中,有两种角色,分别是被观察者和观察者。被观察者有一个列表存储它的所有观察者,并且支持动态增加和删除观察者。当被观察者的状态发生改变时,它会循环通知它的所有观察者执行特定的操作。

观察者模式的优势

  • 观察者模式降低了系统的耦合度。
  • 观察者模式增强了程序的灵活性和扩展性。
  • 观察者模式通过维护一对多的依赖关系,使得被观察者和观察者之间松散耦合。

观察者模式的应用场景

  • 当一个对象的改变需要同时改变其他对象时,而又不知道有多少对象需要改变时,使用观察者模式。
  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面时,使用观察者模式。
  • 当一个对象必须通知其他对象,但是又不想和其他对象形成紧耦合关系时,使用观察者模式。

示例说明

示例1

下面我们来看一个简单的示例,模拟A公司发送消息到B公司,B公司接收消息的场景。

首先,我们定义一个抽象主题(Subject)接口,用于定义被观察者的行为。

public interface ISubject
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers(string message);
}

然后,我们定义一个具体主题(ConcreteSubject)类,实现抽象主题接口,并在其中增加一个用于存储观察者的列表。

public class ConcreteSubject : ISubject
{
    private List<IObserver> observers;

    public ConcreteSubject()
    {
        this.observers = new List<IObserver>();
    }

    public void RegisterObserver(IObserver observer)
    {
        this.observers.Add(observer);
    }

    public void RemoveObserver(IObserver observer)
    {
        this.observers.Remove(observer);
    }

    public void NotifyObservers(string message)
    {
        foreach (var observer in observers)
        {
            observer.Update(message);
        }
    }
}

接下来,我们定义一个抽象观察者(Observer)接口,用于定义观察者的行为。

public interface IObserver
{
    void Update(string message);
}

最后,我们定义一个具体观察者(ConcreteObserver)类,实现抽象观察者接口,并在其中实现观察者的行为。

public class ConcreteObserver : IObserver
{
    private string name;

    public ConcreteObserver(string name)
    {
        this.name = name;
    }

    public void Update(string message)
    {
        Console.WriteLine("{0} received the message: {1}", name, message);
    }
}

现在,我们可以编写下面的代码进行测试:

class Program
{
    static void Main(string[] args)
    {
        // 创建被观察者对象
        ISubject subject = new ConcreteSubject();

        // 创建观察者对象
        IObserver observer1 = new ConcreteObserver("Observer1");
        IObserver observer2 = new ConcreteObserver("Observer2");

        // 注册观察者对象
        subject.RegisterObserver(observer1);
        subject.RegisterObserver(observer2);

        // 发布消息
        subject.NotifyObservers("A公司发布了新产品");

        // 移除观察者对象
        subject.RemoveObserver(observer2);

        // 发布消息
        subject.NotifyObservers("A公司发布了优惠信息");

        Console.ReadLine();
    }
}

当我们执行以上代码后,将得到以下输出结果:

Observer1 received the message: A公司发布了新产品
Observer2 received the message: A公司发布了新产品
Observer1 received the message: A公司发布了优惠信息

示例2

在上面的示例中,我们使用了类似广播的方式通知所有的观察者。在某些情况下,我们可能需要对每个观察者执行不同的操作。这时可以将观察者作为消息的一部分进行传递,如下所示:

public class ConcreteSubject : ISubject
{
    // ...

    public void NotifyObservers(string message, IObserver observer)
    {
        observer.Update(message);
    }
}

当我们需要通知观察者时,只需要将观察者作为参数传递给被观察者的 NotifyObservers 方法即可。在实际开发中,我们可以在 IObserver 接口中新增一个 Notify 方法,然后让具体观察者类实现该方法即可。

总结

观察者模式是一种非常实用的设计模式,它可以帮助我们解决对象之间紧耦合关系的问题。在实际开发中,我们可以将观察者模式应用到很多场景中,如事件处理、页面自动更新等。使用观察者模式可以使得程序具有更好的可维护性、可扩展性和可复用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 设计模式系列教程-观察者模式 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • c#单例模式(Singleton)的6种实现

    单例模式(Singleton) 单例模式是一种创建型设计模式,它保证一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在需要确保有且仅有一个对象被创建时,使用单例模式就是最佳选择。 实现单例模式的六种方法 1. 饿汉式(饿汉式单例模式是线程安全的,极其简单) 饿汉式单例模式是指,在类加载的时候就创建一个对象实例,并且永久驻留在内存中,以供后续使用。…

    C# 2023年6月6日
    00
  • ASP.NET MVC使用Quartz.NET执行定时任务

    以下是“ASP.NET MVC使用Quartz.NET执行定时任务”的完整攻略: 什么是Quartz.NET Quartz.NET是一个开源的作业调度框架,可以用于在.NET应用程序中执行定时任务。提供了一种简单而强大的方式来调度和执行作业,支持多种触发器类型,如简单触发器、Cron触发器等。 ASP.NET MVC使用Quartz.NET执行定时任务的步骤…

    C# 2023年5月12日
    00
  • C#计算输入汉字GBK编码后十六进制数输出的方法

    C#计算输入汉字GBK编码后十六进制数输出的方法 在C#编程中,计算输入汉字GBK编码后的十六进制数输出,可以使用以下代码实现。 代码实现 using System.Text; public string ToGBKHexString(string text) { var encoding = Encoding.GetEncoding("GBK&q…

    C# 2023年6月7日
    00
  • 在WPF中合并两个ObservableCollection集合

    在WPF中合并两个ObservableCollection集合的攻略可以分为以下步骤: 1. 创建两个ObservableCollection集合 首先,我们需要创建两个不同的ObservableCollection集合,并分别往其中添加数据,如下所示: ObservableCollection<string> collection1 = new…

    C# 2023年6月6日
    00
  • C# File.WriteAllText()方法: 将指定的字符串写入文件,覆盖文件中的所有内容

    File.WriteAllText() 是C#中的一个静态方法,主要作用是向文件写入文本并替换文件内容。它的使用方法如下: File.WriteAllText(string path, string contents); 其中,path参数是要写入的文件路径;contents参数是要写入的文本内容。 下面通过两个例子来详细讲解 File.WriteAllTe…

    C# 2023年4月19日
    00
  • 详解ASP.NET Core中配置监听URLs的五种方式

    详解ASP.NET Core中配置监听URLs的五种方式 在ASP.NET Core应用程序中,可以通过配置监听URLs来指定应用程序监听的URL地址。本攻略将详细介绍ASP.NET Core中配置监听URLs的五种方式。 方式一:通过appsettings.json文件配置 可以通过在appsettings.json文件中添加以下代码来配置监听URLs: …

    C# 2023年5月16日
    00
  • C# DataGridView添加新行的2个方法

    下面是详细讲解“C# DataGridView添加新行的2个方法”的完整攻略: 1. 使用数据绑定添加新行 使用DataGridView进行数据绑定时,可以通过添加数据源中的新数据来添加新行。下面是添加新行的步骤: 步骤 1:创建数据源 首先,我们需要创建一个数据源。下面是一个示例: var dataSource = new List<Product&…

    C# 2023年6月6日
    00
  • JavaScript ESLint插件保姆级使用教程

    JavaScript ESLint插件保姆级使用教程 1. 什么是ESLint ESLint是一个可扩展的JavaScript代码检查工具。它可以检查代码中的语法错误,提供一致的代码风格,并可以检测代码中的潜在问题。ESLint 可以配置以满足您的特定需求。ESLint内置了很多规则,您也可以通过使用插件来添加自定义规则。 2. 安装ESLint 2.1 安…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部