C# 观察者模式

以下是调用事件来实现的一个观察者模式,看懂的话,观察者模式也差不多了,主要还是要上手试试

当我们使用事件来实现观察者模式时,通常会有两个主要部分:一个被观察的对象(Subject),它包含一个或多个事件;以及观察者(Observer),它们订阅这些事件并在事件发生时执行相应的操作。以下是一个简单的使用事件来实现观察者模式的示例:

首先,我们定义观察者接口 IObserver:

public interface IObserver  
{  
    void OnEventRaised(string message);  
}

接下来,我们定义被观察对象 Subject,它包含一个事件 EventRaised 和管理观察者列表的功能:

using System;  
using System.Collections.Generic;  
  
public class Subject  
{  
    // 事件,当某件事情发生时触发  
    public event Action<string> EventRaised;  
  
    // 观察者列表  
    private List<IObserver> observers = new List<IObserver>();  
  
    // 订阅事件  
    public void Attach(IObserver observer)  
    {  
        observers.Add(observer);  
        // 当添加新的观察者时,直接订阅事件  
        EventRaised += observer.OnEventRaised;  
    }  
  
    // 取消订阅事件  
    public void Detach(IObserver observer)  
    {  
        observers.Remove(observer);  
        // 当移除观察者时,取消订阅事件  
        EventRaised -= observer.OnEventRaised;  
    }  
  
    // 通知所有观察者  
    protected virtual void NotifyObservers(string message)  
    {  
        // 触发事件  
        EventRaised?.Invoke(message);  
    }  
  
    // 当有事情发生时,调用此方法  
    public void RaiseEvent(string message)  
    {  
        NotifyObservers(message);  
    }  
}

现在,我们定义一个具体的观察者 ConcreteObserver 类,它实现了 IObserver 接口:

public class ConcreteObserver : IObserver  
{  
    private string name;  
  
    public ConcreteObserver(string name)  
    {  
        this.name = name;  
    }  
  
    public void OnEventRaised(string message)  
    {  
        Console.WriteLine("{0} received message: {1}", name, message);  
    }  
}

最后,我们使用这些类来演示观察者模式的使用:

class Program  
{  
    static void Main(string[] args)  
    {  
        // 创建被观察对象  
        Subject subject = new Subject();  
  
        // 创建观察者并订阅事件  
        IObserver observer1 = new ConcreteObserver("Observer 1");  
        IObserver observer2 = new ConcreteObserver("Observer 2");  
        subject.Attach(observer1);  
        subject.Attach(observer2);  
  
        // 触发事件,通知所有观察者  
        subject.RaiseEvent("Hello from Subject!");  
  
        // 取消一个观察者的订阅  
        subject.Detach(observer1);  
  
        // 再次触发事件,这次只有observer2会收到通知  
        subject.RaiseEvent("Another message from Subject!");  
    }  
}

在这个示例中,Subject 类包含了一个 EventRaised 事件,它用于通知观察者。观察者通过实现 IObserver 接口并定义 OnEventRaised 方法来响应事件。当 Subject 的 RaiseEvent 方法被调用时,它会通过触发 EventRaised 事件来通知所有已订阅的观察者。观察者通过调用 Attach 方法来订阅事件,并通过调用 Detach 方法来取消订阅。

这种实现方式使得 Subject 和 Observer 之间完全解耦,因为观察者通过事件与 Subject 进行交互,而不是直接调用 Subject 的方法。这提高了代码的灵活性和可维护性,使得添加新的观察者或修改事件的通知逻辑变得更加容易。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

語衣

感谢大哥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值