【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();
    }
}

运行结果

相关推荐
冰茶_2 小时前
C#中进程和线程的区别--17
开发语言·学习·c#
玉面小君3 小时前
C# 数据拟合教程:使用 Math.NET Numerics 的简单实现
算法·c#·c·数据拟合
angen20183 小时前
二十三种设计模式-代理模式
设计模式·代理模式
Dolphin_Home4 小时前
生产环境中常用的设计模式
设计模式
荣--6 小时前
编程练习:编写一个监听者模式类
c++·设计模式·observer·监听者模式
假装我不帅6 小时前
C#+ckeidtor5实现图片上传
c#·ckeditor5
Eiceblue8 小时前
在.NET用C#将Word文档转换为HTML格式
开发语言·vscode·c#·html·word·.net
步、步、为营8 小时前
C#局部函数 VS Lambda表达式
开发语言·windows·c#
Eiceblue8 小时前
C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等
pdf·c#·.net·visual studio
pchmi8 小时前
C# OpenCV机器视觉:极大值抑制
人工智能·opencv·目标检测·计算机视觉·c#·机器视觉·模板匹配