【C#设计模式(20)——观察者模式(Observer Pattern)】

前言

观察者模式

观察者模式:定义了一种对象之间的一对多依赖关系,消息发布者发布通知时,它的所有订阅者(依赖)对象都会自动收到通知并进行相应的更新。

代码

csharp 复制代码
//抽象观察者类
public abstract class Observer
{
    protected string name;
    public string Name { get { return name; } }
    public Observer(string name)
    {
        this.name = name;
    }
    
    public abstract void Update(string message);
}

//具体观察者类1:主题订阅类
public class SubscribeSubject : Observer
{
    public SubscribeSubject(string name) : base(name){}
    public override void Update(string message)
    {
        Console.WriteLine($"[{name}] received a subject message : {message}");
    }
}
//具体观察者类2:消息订阅类
public class MessageReceiver : Observer
{
    public MessageReceiver(string name) : base(name){}

    public override void Update(string message)
    {
        Console.WriteLine($"[{name}] received a subject message : {message}");
    }
}

//(抽象)主题接口
public interface Subject
{
    void Attch(Observer observer);
    void Detach(Observer observer);
    void NotifyObservers(string message);
}
//具体主题:发布主题类
public class PublishSubject : Subject
{
    public List<Observer> Observers = new List<Observer>();
    public void Attch(Observer observer)
    {
        Observers.Add(observer);
        Console.WriteLine($"Add an subscriber[type={observer.GetType().Name}],[ name = {observer.Name}]");
    }

    public void Detach(Observer observer)
    {
        Observers.Remove(observer);
        Console.WriteLine($"Removes an subscriber: {observer.Name}");
    }

    public void NotifyObservers(string message)
    {
        Console.WriteLine($"publish a notify:{message}");
        foreach (var item in Observers)
        {
            item.Update(message);
        }
    }
}

/*
 * 行为型模式:Behavioral Pattern
 * 观察者模式:Observer Pattern
 */
internal class Program
{
    static void Main(string[] args)
    {
        //创建观察者
        Observer observer1 = new SubscribeSubject("User1");
        Observer observer2 = new SubscribeSubject("User2");
        Observer observer3 = new SubscribeSubject("User3");
        Observer observer4 = new SubscribeSubject("User4");
        Observer observer5 = new MessageReceiver("User5");

        //创建发布者
        Subject pubulisher = new PublishSubject();

        //发布者记录观察者
        pubulisher.Attch(observer1);
        pubulisher.Attch(observer2);
        pubulisher.Attch(observer3);
        pubulisher.Attch(observer4);
        pubulisher.Attch(observer5);

        //发布消息
        Console.WriteLine();
        pubulisher.NotifyObservers("Hellow users.");
        Console.WriteLine();
        pubulisher.Detach(observer1);
        Console.WriteLine();
        pubulisher.NotifyObservers("see you again,users!");
        Console.ReadLine();
    }
}

运行结果

相关推荐
The Shio2 分钟前
上位机对接设备协议踩坑指南
网络·单片机·嵌入式硬件·物联网·c#·.net
CompaqCV4 分钟前
OpencvSharp 算子学习教案之 - Cv2.Add
学习·c#·opencvsharp算子
CompaqCV9 分钟前
OpencvSharp 算子学习教案之 - Cv2.Subtract 重载3
学习·c#·opencvsharp算子·opencv教程
天若有情67319 分钟前
原创C++设计模式:功能归一化——无继承、轻量版AOP,比传统OOP更优雅
开发语言·c++·设计模式·oop
傻啦嘿哟1 小时前
如何用 Python 拆分 Word 文件:高效分割大型文档的完整指南
开发语言·c#
hoiii1871 小时前
C# 读取 CSV/Excel 文件数据至 DataGridView
开发语言·c#·excel
xiaoshuaishuai81 小时前
C# 实现“superpowers进化
运维·服务器·windows·c#
神仙别闹1 小时前
基于 MATLAB 实现 Word 的信息隐藏算法
c#·word·xhtml
csdn_aspnet10 小时前
C# (QuickSort using Random Pivoting)使用随机枢轴的快速排序
数据结构·算法·c#·排序算法
游乐码16 小时前
c#lambad表达式
开发语言·c#