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

运行结果

相关推荐
DKPT17 分钟前
Java享元模式实现方式与应用场景分析
java·笔记·学习·设计模式·享元模式
ajassi200019 分钟前
开源 C# .net mvc 开发(八)IIS Express轻量化Web服务器的配置和使用
linux·开源·c#·mvc·.net
缘来是庄26 分钟前
设计模式之迭代器模式
java·设计模式·迭代器模式
摘星编程3 小时前
深入解析迭代器模式:优雅地遍历聚合对象元素
设计模式·迭代器模式·软件开发·编程技巧·面向对象设计
19H5 小时前
Flink-Source算子状态恢复分析
c#·linq
枯萎穿心攻击7 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
DKPT8 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
Eiceblue9 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
缘来是庄14 小时前
设计模式之中介者模式
java·设计模式·中介者模式
昏睡红猹16 小时前
C#脚本化(Roslyn):如何在运行时引入nuget包
c#