【行为型设计模式】C#设计模式之观察者模式

csharp 复制代码
题目:假设你正在开发一个简单的新闻发布系统,该系统允许用户订阅不同的新闻频道,并在有新闻发布时向订阅者发送通知。使用观察者模式设计和实现该系统。

观察者模式的相关概念和定义:
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,以便当一个对象的状态发生变化时,可以自动通知其他相关对象。在这种模式中,存在两种角色:

主题(Subject):也称为被观察者或发布者,在观察者模式中起通知的作用。主题维护着一组观察者,并提供注册、注销和通知的方法。

观察者(Observer):也称为订阅者或监听器,观察者通过注册到主题来接收通知并进行相应的处理。当主题的状态发生变化时,观察者将根据接收到的通知执行相应的操作。

观察者模式的基本思想是主题与观察者之间是松耦合的关系,使得它们可以独立地变化,而不会互相影响。主题只需要维护观察者列表并通知它们即可,无需了解观察者具体的实现细节。

在上述的新闻发布系统中,主题可以是一个新闻频道,观察者可以是用户订阅该频道的用户。当有新闻发布时,主题将通知所有相关观察者,并将新闻内容传递给它们。观察者接收到通知后可以根据需要进行相应的处理,比如显示通知、发送邮件等。

通过观察者模式,我们可以实现松耦合的系统设计,使得主题和观察者可以独立地扩展和修改,从而提高代码的可维护性和可扩展性。同时,观察者模式也符合开闭原则,因为我们可以动态地添加或删除观察者,而无需修改主题的代码。

参考代码:

csharp 复制代码
class Program
{
    static void Main(string[] args)
    {
      NewsChannel channel = new NewsChannel();
        // 创建观察者对象
        IObserver subscriber1 = new Subscriber("订阅者1");
        IObserver subscriber2 = new Subscriber("订阅者2");
        IObserver subscriber3 = new Subscriber("订阅者3");

        // 注册观察者
        channel.RegisterObserver(subscriber1);
        channel.RegisterObserver(subscriber2);
        channel.RegisterObserver(subscriber3);

        // 发布新闻
        channel.PublishNews("今日头条:天气晴朗!");
        Console.WriteLine();

        // 取消订阅观察者
        channel.UnregisterObserver(subscriber2);

        // 发布新闻
        channel.PublishNews("特别新闻:重要通知!");
    }
}



public interface ISubject 
{
    void RegisterObserver(IObserver observer);
    void UnregisterObserver(IObserver observer);
    void NotifyObservers(string news);
}

public interface IObserver 
{
    void Update(string news);
}


public class NewsChannel : ISubject
{
    private List<IObserver> _observers;
    private string lastNews;
    public NewsChannel()
    {
        _observers = new List<IObserver>();
    }
    public void NotifyObservers(string news)
    {
        foreach (var observer in _observers)
        {
            observer.Update(news);
        }
    }

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

    public void UnregisterObserver(IObserver observer)
    {
        _observers.Remove(observer);
    }


    public void PublishNews(string news)
    {
        lastNews = news;
        Console.WriteLine("新闻发布:" + news);
        NotifyObservers(news);
    }

}

public class Subscriber : IObserver
{
        private string _name;

        public Subscriber(string name ) 
        {

            _name = name;
        }
  
        public void Update(string news)
        {
            Console.WriteLine(_name + " 收到新闻:" + news);
        }
    
}
相关推荐
思忖小下28 分钟前
梳理你的思路(从OOP到架构设计)_设计模式Template Method模式
设计模式·模板方法模式·eit
向宇it7 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
向宇it9 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
东风吹柳10 小时前
观察者模式(sigslot in C++)
c++·观察者模式·信号槽·sigslot
思忖小下11 小时前
梳理你的思路(从OOP到架构设计)_简介设计模式
设计模式·架构·eit
liyinuo201713 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
坐井观老天14 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
aaasssdddd9615 小时前
C++的封装(十四):《设计模式》这本书
数据结构·c++·设计模式
T1an-115 小时前
设计模式之【观察者模式】
观察者模式·设计模式
pchmi16 小时前
C# OpenCV机器视觉:模板匹配
opencv·c#·机器视觉