首页 > 其他分享 >观察者模式

观察者模式

时间:2024-09-09 15:05:26浏览次数:1  
标签:observer void 主题 观察者 模式 IObserver ConcreteObserver

观察者模式是一种行为设计模式,在该模式中,一个对象(称为主题)维护一组依赖它的对象(称为观察者),当主题状态发生变化时,它会自动通知并更新所有观察者。下面是一个简单的观察者模式的示例代码:

using System;
using System.Collections.Generic;

// 主题接口
interface ISubject
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

// 观察者接口
interface IObserver
{
    void Update(string message);
}

// 具体主题类
class ConcreteSubject : ISubject
{
    private List<IObserver> observers = new List<IObserver>();
    private string state;

    public void RegisterObserver(IObserver observer)
    {
        observers.Add(observer);
    }

    public void RemoveObserver(IObserver observer)
    {
        observers.Remove(observer);
    }

    public void NotifyObservers()
    {
        foreach (var observer in observers)
        {
            observer.Update(state);
        }
    }

    // 当状态发生改变时触发通知
    public void SetState(string newState)
    {
        state = newState;
        NotifyObservers();
    }
}

// 具体观察者类
class ConcreteObserver : IObserver
{
    private string observerName;

    public ConcreteObserver(string name)
    {
        observerName = name;
    }

    public void Update(string message)
    {
        Console.WriteLine($"Observer {observerName} received message: {message}");
    }
}

class Program
{
    static void Main()
    {
        ConcreteSubject subject = new ConcreteSubject();

        ConcreteObserver observer1 = new ConcreteObserver("1");
        ConcreteObserver observer2 = new ConcreteObserver("2");
        ConcreteObserver observer3 = new ConcreteObserver("3");

        subject.RegisterObserver(observer1);
        subject.RegisterObserver(observer2);
        subject.RegisterObserver(observer3);

        subject.SetState("New State");
    }
}

在上面的代码中,我们定义了一个主题接口 ISubject 和一个观察者接口 IObserver,并实现了具体的主题类 ConcreteSubject 和具体的观察者类 ConcreteObserver。主题类维护观察者列表,可以注册、移除观察者,并在状态发生变化时通知所有观察者。观察者类实现观察者接口,在接收到主题的通知时进行相应的更新操作。

在 Main() 方法中,我们实例化主题对象和三个观察者对象,将观察者注册到主题中,并通过 SetState() 方法改变主题的状态,从而触发通知并更新所有观察者。每个观察者在接收到通知时会输出相应的信息。

这个例子展示了观察者模式的基本实现,通过这种方式,主题与观察者之间实现了解耦,主题可以独立改变状态并通知观察者,观察者可以自由地订阅和取消订阅主题的通知。

标签:observer,void,主题,观察者,模式,IObserver,ConcreteObserver
From: https://www.cnblogs.com/wuqihe/p/18404582

相关文章

  • 工厂模式
    工厂模式是一种常见的设计模式,它用于创建对象的方式。在工厂模式中,我们定义一个接口或者抽象类来创建对象,而将实际的对象创建延迟到子类中。这样可以以统一的方式创建对象,同时也可以方便地扩展和修改对象的创建过程。下面是一个简单的示例代码,演示了工厂模式的实现:usingSystem......
  • 策略模式
    策略模式是一种行为设计模式,它允许在运行时根据需要选择算法。这种模式定义了一系列算法,并使得这些算法在使用的时候可以相互替换。客户端可以根据不同的情况选择合适的策略来处理问题,而不需要修改具体使用策略的代码。以下是一个简单的策略模式示例代码:usingSystem;//策略......
  • 装饰器模式
    装饰器模式是一种结构型设计模式,它允许在不改变原有对象结构的情况下,动态地添加额外的功能或责任到对象上。这种模式通过创建包装类(装饰器类)来包裹原始类实例,并提供额外的功能。以下是一个简单的装饰器模式的示例代码:usingSystem;//抽象组件接口interfaceIComponent{......
  • 适配器模式
    适配器模式是一种结构型设计模式,用于将一个类的接口转换成另一个客户期望的接口。这种模式可以让原本由于接口不兼容而无法在一起工作的类能够协同工作。以下是一个简单的适配器模式的示例代码:usingSystem;//目标接口interfaceITarget{voidRequest();}//适配......
  • 责任链模式
    责任链模式是一种行为设计模式,它允许多个对象处理请求,而无需指定处理请求的具体处理者。请求沿着链传递,直到有一个对象处理它为止。这种模式允许将请求的发送者和接收者解耦,并使多个对象都有机会处理请求。以下是一个简单的责任链模式的示例代码:usingSystem;//抽象处理者a......
  • 案例分析:如何用设计模式优化性能14
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能15
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能8
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • 案例分析:如何用设计模式优化性能10
    设计模式就是对常用开发技巧进行的总结,它使得程序员之间交流问题,有了更专业、便捷的方式。比如,我们在《02|理论分析:性能优化有章可循,谈谈常用的切入点》中提到,I/O模块使用的是装饰器模式,你就能很容易想到I/O模块的代码组织方式。事实上,大多数设计模式并不能增加程序的性......
  • Prometheus的拉取模式与zabbix推送模式有何区别?各有什么优缺点?
    Prometheus的拉取模式与Zabbix的推送模式在监控数据收集和处理方式上存在显著区别。以下是它们的主要区别及各自的优缺点:1.数据收集模式Prometheus拉取模式:Prometheus定期从被监控的目标(如Exporter、应用程序等)主动拉取数据。每个目标都需要暴露一个HTTP接口,Prome......