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

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#在控制台输出彩色文字的方法

    下面我将详细讲解如何在C#控制台输出彩色文字。 1. 使用系统默认颜色 在C#控制台中,可以使用控制台对象Console的静态方法来输出彩色文字。首先让我们来看一下使用系统默认颜色的方法。 使用Console.ForegroundColor属性设置前景色,即文字颜色,使用Console.BackgroundColor属性设置背景色,然后使用Console.W…

    C# 2023年6月7日
    00
  • C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨

    C#开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨 简介 本文主要介绍使用C#进行Socket网络编程时,涉及到的TCP/IP协议中的各个层次模型、端口以及报文等内容,并提供两个基本示例进行说明。 TCP/IP协议层次模型 TCP/IP协议是网络通信的基础,它将网络通信分为许多层,每一层负责不同的任务。这些层从下往上分别是:物理层、数据链路…

    C# 2023年6月7日
    00
  • 使用JsonConverter处理上传文件的路径问题

    为了讲解使用JsonConverter处理上传文件的路径问题的完整攻略,我们首先需要了解以下几点: 在使用表单上传文件时,文件被上传到服务器的临时目录中,而其路径是以操作系统为基础的绝对路径。 在Json格式中,使用斜杠(/)来表示路径分隔符。 在路径处理中,我们需要处理不同操作系统下的路径分隔符,因为在Windows上使用反斜杠(\)作为路径分隔符,在Un…

    C# 2023年5月31日
    00
  • Asp.Net Cache缓存使用代码

    接下来我将为您讲解Asp.Net Cache缓存使用代码的完整攻略。 Asp.Net Cache缓存简介 首先,我们来了解一下Asp.Net Cache缓存。 缓存是一种常见的优化技术,通过将经常使用的数据缓存到内存中,以提高系统的性能和响应速度。而Asp.Net提供了一个Cache对象来实现缓存功能。 Asp.Net的Cache对象是一个全局对象,可以在所…

    C# 2023年5月31日
    00
  • asp.net 获取机器硬件信息(cpu频率、磁盘可用空间、内存容量等)

    获取机器硬件信息是一个常见的需求,特别是在系统监控和性能优化的场景下。ASP.NET提供了多种方法来获取机器硬件信息,包括CPU频率、磁盘可用空间、内存容量等。 以下是获取机器硬件信息的完整攻略。 1. 获取CPU频率 获取CPU频率可以通过System.Management命名空间中的ManagementObject类来实现。具体代码如下: using S…

    C# 2023年6月3日
    00
  • C#给Word不同页面设置不同背景

    下面是详细的攻略: 步骤一:准备工作 在开始C#编程之前,我们需要做一些准备工作: 掌握C#编程语言的基本语法和知识。 安装Microsoft Office套件。 安装Microsoft Word编程组件(VSTO)。 步骤二:生成背景图片 在给Word不同页面设置不同背景时,我们需要先生成对应的背景图片。具体生成方法可以使用Photoshop或其他图片处理…

    C# 2023年6月3日
    00
  • 聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 1. 接口究竟是什么? 在C#中,接口(interface)是一种定义了一组方法、属性和事件的规范 (specification),但没有提供实现代码的一种类型。接口可以被类或结构(struct)实现,实现接口的类或结构需要实现接口中定义的所有成员,并且成员的访问级别不能低于接口的访问级别。 2. 接口的作用 接口主要有以下两个作用: 定…

    C# 2023年6月6日
    00
  • C#使用selenium实现爬虫

    下面是详细讲解“C#使用selenium实现爬虫”的完整攻略: 一、什么是selenium selenium是一个自动化测试工具,能够模拟用户在浏览器中的操作。它支持多种编程语言,包括Java、Python、C#等,并且可以操作多种浏览器(包括Chrome、Firefox、Safari等)。在爬虫领域,selenium可以模拟用户操作,对JavaScript…

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