.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# 网络编程之http

    C# 网络编程之 HTTP 完整攻略 在本文中,将会介绍 C# 网络编程之 HTTP,包括 HTTP 协议介绍、C# 中的 HTTP 编程以及两个示例。 HTTP 协议介绍 HTTP(HyperText Transfer Protocol),即超文本传输协议,是 Internet 上应用最为广泛的一种网络协议。HTTP 协议是基于请求和响应模式的、无状态的协…

    C# 2023年5月15日
    00
  • 一文详解C#中方法重载的底层玩法

    一文详解C#中方法重载的底层玩法 方法重载是C#中一种常见的编程技巧,在不同的情况下,同一个方法可以有不同的实现。这篇文章将讲解C#中方法重载的底层原理,并提供两个具体的示例。 方法重载的基本概念 方法重载是指可以创建多个方法,这些方法具有相同的名称,但它们的参数类型、个数、顺序不同。在调用这些方法时,编译器会自动根据传入的参数类型、个数、顺序等信息选择匹配…

    C# 2023年5月15日
    00
  • MSScriptControl.ScriptControl组件的用法实例

    MSScriptControl.ScriptControl组件的用法实例 简介 MSScriptControl.ScriptControl是一个用于Windows开发的脚本控制器,在运行时可以解释和执行脚本代码。它支持多种脚本语言,如JavaScript、VBScript等,并提供了丰富的API接口,可用于实现各种脚本功能,是非常实用的开发工具。 安装 MS…

    C# 2023年5月31日
    00
  • Unity实战之制作动画编辑器

    Unity实战之制作动画编辑器 在Unity中,可以使用动画编辑器创建和编辑动画。本文将介绍如何制作一个自定义的动画编辑器,以便更好地管理和编辑动画。 步骤1:创建自定义窗口 首先,我们需要创建一个自定义窗口。可以使用Unity的EditorGUILayout和EditorWindow类创建自定义窗口。以下是一个简单的示例: using UnityEdito…

    C# 2023年5月15日
    00
  • C#使用Enum.TryParse()实现枚举安全转换

    当我们需要将字符串或整数等类型转换为枚举类型时,可以使用C#提供的Enum.TryParse()方法来实现安全转换,避免了在转换时可能会抛出异常的情况。 什么是枚举类型 枚举类型是一种特殊的值类型(Value Type),它限定了该类型变量只能是预先定义好的枚举值中的一种。枚举类型可以在程序中用于表示特定的常量值,例如星期几、性别等。 Enum.TryPar…

    C# 2023年5月14日
    00
  • C#中Property和Attribute的区别实例详解

    当我们在使用C#编程语言进行开发时,会经常用到Property和Attribute这两个概念,它们虽然有些类似,但是在用法和作用上还是有所区别的。接下来,我将详细讲解C#中Property和Attribute的区别,包括其定义、用法、实例等内容。 Property和Attribute的定义 Property(属性)是一种C#中的成员,它可以让我们在类的外部访…

    C# 2023年5月15日
    00
  • C#实现跑马灯效果的示例代码

    让我们来详细讲解如何使用 C# 实现跑马灯效果的示例代码。 1. 创建 WinForm 应用 首先,我们需要创建一个 WinForm 应用,在 Visual Studio 中选择 File -> New -> Project,然后选择 Windows Forms App (.NET Framework)。在弹出的窗口中,我们可以输入项目的名称并选…

    C# 2023年6月6日
    00
  • .Net反向代理组件Yarp用法详解

    以下是“.Net反向代理组件Yarp用法详解”的完整攻略: 什么是Yarp Yarp(Yet Another Reverse Proxy)是一个开源的反向代理组件,由微软开发。它是一个轻量级、高性能、可扩展的反向代理组件,可以用于构建高性能的微服务网关、API网关等。 Yarp的特性 Yarp具有以下特性: 支持HTTP、HTTPS、WebSocket等协议…

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