.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日

相关文章

  • HttpWebRequest实现下载图片至本地

    下面我来详细讲解如何用 HttpWebRequest 实现下载图片至本地: 1. HttpWebRequest 简介 HttpWebRequest 是 .NET Framework 提供的一个类,用于创建 HTTP 请求并与 Web 服务器进行通信。使用 HttpWebRequest 可以发送 GET、POST 和其他 HTTP 请求,在本例中,我们将使用 …

    C# 2023年5月31日
    00
  • .net加载失败的程序集实现重新加载

    针对“.Net加载失败的程序集实现重新加载”这个主题,我为您总结了以下完整攻略: 1. 背景介绍 在开发和运行.NET程序时,我们常会遇到程序集加载失败的情况。在这种情况下,我们可以采用重新加载程序集的方法来解决该问题。本文将介绍如何实现重新加载失败的程序集。 2. 实现步骤 步骤1:确定程序集加载失败的原因 在进行重新加载之前,我们需要先确定程序集加载失败…

    C# 2023年5月15日
    00
  • 详解ASP.NET Core 2.0 路由引擎之网址生成(译)

    详解ASP.NET Core 2.0 路由引擎之网址生成攻略 在本攻略中,我们将详细讲解ASP.NET Core 2.0路由引擎之网址生成,并提供两个示例说明。 步骤一:创建路由 在ASP.NET Core 2.0应用程序中,您需要创建一个路由。以下是一个示例: app.UseMvc(routes => { routes.MapRoute( name:…

    C# 2023年5月17日
    00
  • C#集合Collections购物车Shopping Cart(实例讲解)

    C#集合Collections购物车Shopping Cart(实例讲解) 这篇文章将向您介绍如何使用C#集合实现购物车功能。购物车是电商网站中非常常见的功能之一,它允许用户将他们感兴趣的商品加入到购物车中,随时查看购物车中的商品数量和总价等信息,最终下单付款。 实现思路 为了实现购物车功能,我们需要以下几个步骤: 在页面展示商品列表,并为每个商品提供一个“…

    C# 2023年6月7日
    00
  • Blazor UI库 Bootstrap Blazor 快速上手 (v7.5.7)

    最近组件库更新比较频繁,有些同学感觉有点迷茫,就着今天刚上了张老板一节课立马撸个新的上手教程回馈社区, ;-> 1.新建工程b18QuickStartv757,将项目添加到解决方案中 dotnet new blazorserver -o b18QuickStartv757 dotnet sln add b18QuickStartv757/b18Quic…

    C# 2023年4月27日
    00
  • C# DataTable.Select()根据条件筛选数据问题

    针对“C# DataTable.Select()根据条件筛选数据问题”,我为你准备了以下完整攻略: 什么是C# DataTable? C# DataTable是一种内存中的表格类型,它通常用于在程序中操作和存储数据。DataTable类提供了一系列方法,可以实现增、删、改、查等常用操作。 什么是DataTable.Select()方法? C# DataTab…

    C# 2023年5月15日
    00
  • Django视图层与模板层实例详解

    Django是一个用Python编写的Web框架,可以帮助开发者快速地构建Web应用程序。在Django中,视图层和模板层负责处理用户请求和生成响应。 Django视图层 Django视图层是处理用户请求并返回响应的代码片段。视图函数是指接受HTTP请求并返回HTTP响应的函数。在Django中,视图函数必须满足以下条件: 视图函数必须是Python函数 视…

    C# 2023年5月15日
    00
  • C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐)

    C#版免费离线人脸识别之虹软ArcSoft V3.0(推荐)是一款完全开源免费的人脸识别程序,使用者可以在本地环境下运行,不需要联网即可进行人脸识别。下面是详细的使用攻略。 1. 安装ArcSoft SDK 首先,在官网下载并安装ArcSoft SDK,根据自己的操作系统版本选择相应的SDK安装包,可以在ArcSoft官网的开发者中心下载: http://w…

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