.Net行为型设计模式之观察者模式(Observer)

.Net行为型设计模式之观察者模式(Observer)

观察者模式(Observer),是一种行为型设计模式,它定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式中的被观察者和观察者之间是松耦合的,它们之间没有直接的耦合关系,而是通过抽象化的通知来进行交互。

观察者模式中主要有以下角色:

  • Subject(被观察者):被观察者是具体的被观察者对象,它维护着一个观察者列表,提供注册、删除和通知等方法。
  • Observer(观察者):观察者是具体的观察者对象,每个观察者都会对被观察者的变化做出响应。
  • ConcreteSubject(具体被观察者):具体被观察者是被观察者角色的实现,它会向观察者广播事件,实现通知的具体逻辑。
  • ConcreteObserver(具体观察者):具体观察者是观察者角色的实现,它会根据被观察者的事件来做出响应。

示例1

下面是一个简单的示例,以模拟一个电商网站中最近活动的商品为例。具体被观察者为Goods类,具体观察者为User类。

public interface IGoods
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

public class Goods : IGoods
{
    private readonly List<IObserver> _observers = new List<IObserver>();
    private string _name;
    private double _price;

    public Goods(string name, double price)
    {
        _name = name;
        _price = price;
    }

    public void SetPrice(double price)
    {
        if (price != _price)
        {
            _price = price;
            NotifyObservers();
        }
    }

    public void RegisterObserver(IObserver observer)
    {
        if (!_observers.Contains(observer))
        {
            _observers.Add(observer);
        }
    }

    public void RemoveObserver(IObserver observer)
    {
        if (_observers.Contains(observer))
        {
            _observers.Remove(observer);
        }
    }

    public void NotifyObservers()
    {
        foreach (var observer in _observers)
        {
            observer.Update(_name, _price);
        }
    }
}

public interface IObserver
{
    void Update(string name, double price);
}

public class User : IObserver
{
    private readonly string _name;
    private double _maxPrice;

    public User(string name, double maxPrice)
    {
        _name = name;
        _maxPrice = maxPrice;
    }

    public void Update(string name, double price)
    {
        if (price > _maxPrice)
        {
            Console.WriteLine($"{_name}收到了{price.ToString("C2")}元的{name}商品促销通知。");
        }
    }

    public void SetMaxPrice(double maxPrice)
    {
        _maxPrice = maxPrice;
    }
}

示例2

下面是一个更加具体的示例,以模拟一个股票行情的观察者模式为例。具体被观察者为Stock类,具体观察者为Investor类。

public interface IStock
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

public class Stock : IStock
{
    private readonly List<IObserver> _observers = new List<IObserver>();
    private string _name;
    private double _price;

    public Stock(string name, double price)
    {
        _name = name;
        _price = price;
    }

    public void SetPrice(double price)
    {
        if (price != _price)
        {
            _price = price;
            NotifyObservers();
        }
    }

    public void RegisterObserver(IObserver observer)
    {
        if (!_observers.Contains(observer))
        {
            _observers.Add(observer);
        }
    }

    public void RemoveObserver(IObserver observer)
    {
        if (_observers.Contains(observer))
        {
            _observers.Remove(observer);
        }
    }

    public void NotifyObservers()
    {
        foreach (var observer in _observers)
        {
            observer.Update(_name, _price);
        }
    }
}

public interface IObserver
{
    void Update(string name, double price);
}

public class Investor : IObserver
{
    private readonly string _name;

    public Investor(string name)
    {
        _name = name;
    }

    public void Update(string name, double price)
    {
        Console.WriteLine($"{_name}收到了{name}股票的价格变化通知,当前价格为{price.ToString("C2")}元。");
    }
}

以上是具体实现示例的代码。在示例1中,具体被观察者为Goods类,具体观察者为User类。具体被观察者通过维护一个观察者们的列表来实现注册观察者、删除观察者、通知观察者等方法,并通过NotifyObservers()方法广播消息。具体观察者User类实现了IObserver接口,并实现了Update()方法。当具体被观察者Goods类的价格发生变化时,它就会向观察者们发送通知,观察者们便会根据自己的逻辑作出相应的操作,例如在本示例中,如果价格高于某个值,就会通知用户“xx收到了xx元的xx商品促销通知”。

在示例2中,具体被观察者为Stock类,具体观察者为Investor类。具体被观察者和具体观察者都是通过实现IStock和IObserver接口来实现注册观察者、删除观察者、通知观察者等方法,并通过NotifyObservers()方法广播消息。当具体被观察者Stock类的价格发生变化时,它就会向观察者们发送通知,观察者们便会根据自己的逻辑作出相应的操作,例如在本示例中,如果价格发生变化,就会通知投资者“xx收到了xx股票的价格变化通知,当前价格为xx元”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net行为型设计模式之观察者模式(Observer) - Python技术站

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

相关文章

  • C#仿QQ实现简单的截图功能

    下面是“C#仿QQ实现简单的截图功能”的完整攻略。 1. 前置知识 在开始实现截图功能前,有需要掌握的一些前置知识: C#基本语法,如变量、条件、循环等。 Win32 API调用,如获取窗口句柄、原始屏幕坐标等相关API。 GDI+图形处理,如创建位图、图形绘制等相关操作。 2. 实现步骤 2.1 获取要截图的窗口句柄 通过Win32 API获取要截图窗口的…

    C# 2023年5月15日
    00
  • java根据不同的参数调用不同的实现类操作

    要实现根据不同的参数调用不同的实现类操作,我们可以使用工厂模式来解决。 工厂模式 工厂模式是一种创建型设计模式,用于创建对象,而无需指定将使用哪个类来创建对象。它定义一个接口或抽象类,其实现类或子类来决定要实例化的类。这使得我们可以将对象的实例化延迟到子类中进行。在工厂模式中,客户端不用关心产品是如何创建的,只关心需要什么产品。工厂模式的主要优点是它具有很高…

    C# 2023年6月1日
    00
  • asp.net String.Empty NULL 不同之处

    当我们在使用ASP.NET来进行Web应用程序的开发时,经常需要使用到字符串操作。在操作字符串时,我们可能会遇到空字符串和NULL的情况,那么他们之间有什么区别呢?我们来详细讲解一下“asp.net String.Empty NULL 不同之处”。 String.Empty是空字符串,NULL表示空对象引用 String.Empty表示一个长度为0的字符串,…

    C# 2023年5月31日
    00
  • ASP.NET Core 6最小API中使用日志和DI示例详解

    ASP.NET Core 6最小API中使用日志和DI示例详解 在ASP.NET Core 6中,最小API是一种轻量级的方式来构建Web API。在本攻略中,我们将介绍如何在ASP.NET Core 6最小API中使用日志和DI。以下是ASP.NET Core 6最小API中使用日志和DI示例详解的完整攻略: 步骤一:创建最小API 首先,需要创建一个最小…

    C# 2023年5月17日
    00
  • Winform项目中使用FastReport.Net报表控件

    一、FastReport.Net简介 FastReport.Net是一个功能强大的报表生成工具,可以在Windows Forms、ASP.NET、MVC、WPF等各种平台上使用。FastReport.Net的主要特点是易于使用、快速生成高质量报表、具有多种报表类型和格式支持。 二、安装FastReport.Net 在Winform项目中使用FastRepor…

    C# 2023年5月31日
    00
  • ASP.NET MVC学习笔记

    ASP.NET MVC学习笔记 – 完整攻略 什么是 ASP.NET MVC ASP.NET MVC 是一种基于模型-视图-控制器(Model-View-Controller,MVC)模式的架构,它提供了一种让 Web 应用程序的逻辑和表现分离的方式。ASP.NET MVC 通过区分应用程序的逻辑(控制器)和 UI(视图)来改进应用程序的可测试性和可维护性。…

    C# 2023年5月31日
    00
  • asp.net Execl的添加,更新操作实现代码

    接下来我会详细讲解如何在ASP.NET中进行Excel的添加和更新操作。 准备工作 在进行Excel操作之前,我们需要安装EPPlus包,它是一个免费的开源库,可以让我们在ASP.NET中轻松地操作Excel文件。在Visual Studio中,可以通过NuGet包管理器安装EPPlus。 添加Excel文件 要向Excel文件中添加数据,我们需要使用EPP…

    C# 2023年5月31日
    00
  • 通过隐藏option实现select的联动效果

    当我们需要实现 select 元素之间的联动效果时,往往需要使用 JavaScript 动态改变 select 的 options。但实际上,我们也可以通过设置option的隐藏与显示来实现联动效果。 下面是通过隐藏 option 实现 select 的联动效果的完整攻略: 步骤一:编写 HTML 结构 首先我们需要编写 HTML 结构,包含所有要联动的 s…

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