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日

相关文章

  • 利用Asp.Net Core的MiddleWare思想如何处理复杂业务流程详解

    利用Asp.Net Core的MiddleWare思想如何处理复杂业务流程详解 在Asp.Net Core中,MiddleWare是一种非常强大的技术,它可以帮助我们处理复杂的业务流程。本攻略将介绍如何利用Asp.Net Core的MiddleWare思想来处理复杂业务流程,并提供两个示例说明。 MiddleWare思想 MiddleWare是Asp.Net…

    C# 2023年5月17日
    00
  • MVC+jQuery.Ajax异步实现增删改查和分页

    下面就详细讲解一下“MVC+jQuery.Ajax异步实现增删改查和分页”的完整攻略。 一、前置知识 在进行这些操作前,需要先了解一些基本的知识,包括: MVC架构模式:所谓MVC,即Model (模型)、View(视图)、Controller(控制器),是一种一种软件架构模式,将一个应用分成三个核心部分:模型(数据)、视图(UI)、控制器(业务逻辑)。 j…

    C# 2023年5月31日
    00
  • 微软宣布.NET开源:Visual Studio支持Android了

    微软宣布.NET开源:Visual Studio支持Android了 简介 微软宣布.NET Framework将全面开源,并将.NET Core开源为Linux、Mac OS X和Windows的x86平台。Visual Studio 2015也增加了对Android和iOS的支持。这些举措将加强微软在移动领域的布局,推动.NET技术的普及。 .NET开源…

    C# 2023年6月3日
    00
  • C# 扩展方法小结

    非常感谢您对C#扩展方法的关注。以下是关于C#扩展方法的完整攻略。 什么是C#扩展方法 C#扩展方法允许程序员向现有类型添加方法,而不必创建新类来继承该类型。扩展方法是一种特殊的静态方法,它在使用时看起来就像在本地类中定义的方法一样。扩展方法可以显式地指定扩展方法所要扩展的类型,也可以扩展任何类型的对象。 C#扩展方法可以让代码变得更加简洁、易读,也可以在某…

    C# 2023年5月15日
    00
  • ASP.NET常用小技巧

    ASP.NET常用小技巧攻略 简介 ASP.NET是一个非常强大的Web框架,拥有很多小技巧可以节省开发时间并提高效率。本攻略将介绍一些ASP.NET的常用小技巧,可以帮助开发者更好的应用这个框架进行Web应用程序开发。 1. 锐利如刀的@ 符号 在ASP.NET中,@符号有多个用途,最常见的就是作为内嵌代码中的语句分隔符,但是他还有一些更强大的用途。 1.…

    C# 2023年6月3日
    00
  • 浅谈C# 字段和属性

    浅谈C# 字段和属性 在C#编程语言中,字段和属性都是用来存储数据的一种方式。但是在使用时有些微小的差别,下面我们来具体讲解一下。 字段(Field) 字段是在类或结构体内被定义的变量,它们存储着对象或结构体的状态信息。字段通常被直接赋值或通过构造函数来初始化。 定义字段 在类中定义字段的语法如下: 访问修饰符 类型 字段名; 例如: public int …

    C# 2023年6月1日
    00
  • C#文件断点续传实现方法

    C#文件断点续传实现方法攻略 背景和原理介绍 在文件传输中,当传输过程中出现异常,或连接中断,一般需要重新传输。但如果文件太大,重新传输的成本太高,而此时恰好传输过程中已经传输了一部分,通过断点续传可以只续传未完成的部分,可以大幅减少传输成本。文件断点续传实现的原理,在下载时是通过请求服务端时在header部分加上range请求头,标明下载文件的起止断点,服…

    C# 2023年6月1日
    00
  • C#使用SQLDMO操作数据库的方法

    下面我将详细讲解“C#使用SQLDMO操作数据库的方法”的完整攻略。 一、SQLDMO介绍 SQLDMO是一种用于操作Microsoft SQL Server的对象模型。它是一种COM对象模型,使得从C#语言中使用该模型变得十分容易。 二、准备工作 在使用SQLDMO之前,需要引入相应的程序集。程序集一般位于以下地址中: C:\Program Files\M…

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