C#观察者模式详解

一、定义及原理

观察者模式是一种行为设计模式,其定义把对象间的一种依赖关系从静态转化为动态的,从而使得一个对象在其他对象的状态发生改变时被通知并自动更新。

观察者模式中,被观察者维护一个观察者列表,当被观察者的状态发生改变时,遍历观察者列表并调用观察者的统一接口,观察者根据被观察者的状态进行相应的处理。

二、实现方式

在C#中,可以通过委托和事件来实现观察者模式。

首先定义一个委托类型,表示观察者的处理方法:

public delegate void UpdateHandler(object sender, EventArgs e);

然后定义一个被观察者的抽象类或接口,用于添加和删除观察者,以及通知观察者:

public abstract class Subject
{
    // 观察者列表
    private List<UpdateHandler> observers = new List<UpdateHandler>();
    // 注册观察者
    public void Attach(UpdateHandler observer)
    {
        observers.Add(observer);
    }
    // 删除观察者
    public void Detach(UpdateHandler observer)
    {
        observers.Remove(observer);
    }
    // 通知观察者
    public void Notify(object sender, EventArgs e)
    {
        foreach (UpdateHandler observer in observers)
        {
            observer(sender, e);
        }
    }
}

被观察者的子类可以通过继承Subject类来实现添加、删除观察者和通知观察者的方法。

定义一个观察者的抽象类或接口:

public abstract class Observer
{
    // 更新方法,被被观察者调用
    public abstract void Update(object sender, EventArgs e);
}

观察者的子类需要实现Update方法,该方法中根据被观察者的状态进行相应的处理。

三、实例演示

以下是一个简单的实例,演示了观察者模式的用法。

被观察者类:

public class Product : Subject
{
    private string name;
    private double price;
    public Product(string name, double price)
    {
        this.name = name;
        this.price = price;
    }
    // 商品名称
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    // 商品价格
    public double Price
    {
        get { return price; }
        set { price = value; Notify(this, EventArgs.Empty); }
    }
}

观察者类:

public class Customer : Observer
{
    private string name;
    public Customer(string name)
    {
        this.name = name;
    }
    // 更新方法
    public override void Update(object sender, EventArgs e)
    {
        Product product = sender as Product;
        Console.WriteLine($"顾客{name},您关注的商品{name}的价格已经从{product.Price - product.Price * 0.1}元变为{product.Price}元了!");
    }
}

测试类:

class Program
{
    static void Main(string[] args)
    {
        Product product = new Product("Surface Laptop", 9999.99);
        // 添加观察者
        Customer c1 = new Customer("张三");
        Customer c2 = new Customer("李四");
        product.Attach(c1.Update);
        product.Attach(c2.Update);
        // 修改商品价格
        Console.WriteLine("修改商品价格为:8999.99");
        product.Price = 8999.99;
        Console.ReadKey();
    }
}

输出结果:

修改商品价格为:8999.99
顾客张三,您关注的商品Surface Laptop的价格已经从8999.991元变为8999.99元了!
顾客李四,您关注的商品Surface Laptop的价格已经从8999.991元变为8999.99元了!

四、优缺点分析

优点:

  1. 解耦:观察者模式将被观察者和观察者解耦,使得它们可以独立演化。
  2. 扩展性:可以方便地增加新的观察者和被观察者,而不需要修改原有的代码。
  3. 灵活性:观察者模式可以实现松耦合,被观察者和观察者之间只是简单地约定了一种通信方式。

缺点:

  1. 过度使用:如果观察者太多或者观察者与被观察者之间的交互过于复杂,可能会导致代码的维护和理解变得更加困难。此时我们应该考虑使用其他方式替代观察者模式。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/272250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-17 13:55
下一篇 2024-12-17 13:55

相关推荐

  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 显示C++设计模式

    本文将详细介绍显示C++设计模式的概念、类型、优点和代码实现。 一、概念 C++设计模式是在软件设计阶段定义,用于处理常见问题的可重用解决方案。这些解决方案是经过测试和验证的,并已…

    编程 2025-04-27
  • Centos7进入单用户模式的解释

    本文将介绍如何在Centos7中进入单用户模式,并从以下几个方面进行详细的阐述。 一、Centos7进入单用户模式的解答 在Centos7中进入单用户模式需要执行以下步骤: 1. …

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25

发表回复

登录后才能评论