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

运行结果

相关推荐
huaqianzkh5 小时前
WinForm C#:循环修改控件UI闪烁卡顿?SuspendLayout / ResumeLayout 与 BeginUpdate 优化
开发语言·ui·c#
是2的10次方啊5 小时前
设计模式与生活⑲:投影连不上,别急着换投影仪
设计模式
用户3721574261351 天前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
cjz38991 天前
规则树:把一百行if-else拆成一棵树
设计模式
公子小六1 天前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
三雷科技1 天前
第6章第4节:自定义分词器
开发语言·c#
Adellle1 天前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
zhanghaha13141 天前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
是2的10次方啊1 天前
设计模式与生活⑱:工资还没焐热,账单已经凑成一摞
设计模式
百思不得小李2 天前
一个复杂的动态表单是如何实现的
前端·设计模式