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

运行结果

相关推荐
唐青枫1 小时前
对象到底住在哪里?C#.NET 托管堆从分配、GC 到内存排查
c#·.net
fogota3 小时前
Emoji与Segoe MDL2 Assets的比较
c#·wpf
灸木4 小时前
C# 多线程与异步
c#
geovindu5 小时前
rust:Builder Pattern
开发语言·设计模式·rust·建造者模式
小王师傅666 小时前
【设计模式】装饰模式(三):从装饰模式看 Java 与面向对象设计(原理篇)
设计模式
鱼听禅8 小时前
C# 学习笔记-使用 类型化客户端搭建HTTP客户端服务
学习·http·c#·工厂方法模式
Zane19949 小时前
从一次支付渠道扩展需求,看懂"多用组合少用继承"到底在说什么
设计模式
geovindu10 小时前
CSharp:Condition Variable Pattern
后端·设计模式·c#·.net·.netcore·条件变量模式·同步型模式
geovindu10 小时前
sql: Data Modeling Patterns using mysql
sql·mysql·设计模式·数据库开发
淡海水11 小时前
11-03-Unity-List-T-和Dictionary-TKey-TValue-的性能调优实战
算法·unity·c#·list·dictionary