【设计模式】CSharp实现行为型模式之-观察者模式
本文最后更新于120 天前,其中的信息可能已经过时,如有错误请发送邮件到2289035571@QQ.COM

感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请 支持LIncol29! 为了让我能够继续创作更好的内容,你也可以选择订阅博客的 VIP ,包年VIP仅需10元/年,所有VIP内容免费观看

处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,观察者模式也被称为发布/订阅模式。

本文 Lincol 将使用两种方式去实现观察者模式

观察者模式写法

一、使用接口实现

1、抽取出一个IObserver接口

//定义观察者接口
public interface IObserver
{
    void Update(string message);
}

2、抽取出一个 ISubject 接口

//定义主题接口
public interface ISubject
{
    void AddObserver(IObserver ob);
    void RemoveObserver(IObserver ob);
    void Notify();
}

3、主题类实现,需继承 ISubject接口, 使用public 修饰实现的接口方法。将 observerList 集合中的对象 foreach 调用。通知到继承IObersever接口的所有观察者。

//主题类
public class Subject:ISubject
{
    List<IObserver> observerList = new List<IObserver>();

    string message;

    public void AddObserver(IObserver ob)
    {
        observerList.Add(ob);
    }

    public void RemoveObserver(IObserver ob)
    {
        observerList.Remove(ob);
    }

    public void Notify()
    {
        foreach (Observer obj in observerList)
        {
            obj.Update(message);
        }
    }

    public void Setmessage(string message)
    {
        this.message = message;
        Notify();
    }      
}

4、观察者类的实现,继承 IObserver 接口,实现Update方法

public class Observer : IObserver
{
    private string name;
    public Observer(string name)
    {
        this.name = name;
    }
    public void Update(string message)
    {
        Console.WriteLine(name + " already receive " + message);
    }
}

5、Main方法

public static void Main()
{
    Subject subject = new Subject();
    Observer ob1 = new Observer("一号观察者");
    Observer ob2 = new Observer("二号观察者");

    subject.AddObserver(ob1);
    subject.AddObserver(ob2);
    subject.Setmessage("Hello world");
    Console.ReadKey();
}

输出如下:

image-20241014110212504

完整代码

//定义主题接口
public interface ISubject
{
    void AddObserver(IObserver ob);
    void RemoveObserver(IObserver ob);
    void Notify();
}

//定义观察者接口
public interface IObserver
{
    void Update(string message);
}

//主题类
public class Subject:ISubject
{
    List<IObserver> observerList = new List<IObserver>();
    string message;
    public void AddObserver(IObserver ob)
    {
        observerList.Add(ob);
    }

    public void RemoveObserver(IObserver ob)
    {
        observerList.Remove(ob);
    }

    public void Notify()
    {
        foreach (Observer obj in observerList)
        {
            obj.Update(message);
        }
    }

    public void Setmessage(string message)
    {
        this.message = message;
        Notify();
    }      
}

//观察者类
public class Observer : IObserver
{
    private string name;
    public Observer(string name)
    {
        this.name = name;
    }
    public void Update(string message)
    {
        Console.WriteLine(name + " already receive " + message);
    }
}

public class HelloWorld
{
    public static void Main()
    {
        Subject subject = new Subject();
        Observer ob1 = new Observer("一号观察者");
        Observer ob2 = new Observer("二号观察者");

        subject.AddObserver(ob1);
        subject.AddObserver(ob2);
        subject.Setmessage("Hello world");
        Console.ReadKey();
    }
}

二、使用事件实现

使用事件去处理,此方法去实现观察者模式更符合 C# 编程

1、发布类

//发布者
public class Publisher
{
    //声明事件
    public event Action<string> publishEvent;

    //触发事件
    public void Send(string s)
    {
        publishEvent?.Invoke(s);
    }
}

2、订阅者类,定义订阅 以及 取消订阅事件,编写事件对应的方法

//订阅者
public class Subscriber
{
    //订阅事件
    public void Subscribe(Publisher publisher)
    {
        publisher.publishEvent += Receive;
    }
    //取消订阅事件
    public void Unsubscribe(Publisher publisher)
    {
        publisher.publishEvent -= Receive;
    }
    //事件对应的方法
    public void Receive(string message)
    {
        Console.WriteLine("订阅者接受:"+message);
    }
}

3、Main方法使用,观察者订阅被观察者的事件。触发事件

static void Main()
{
    Publisher p = new Publisher();
    Subscriber s1  = new Subscriber();
    Subscriber s2  = new Subscriber();

    s1.Subscribe(p);
    s2.Subscribe(p);
    //调用事件
    p.Send("测试订阅");
    s1.Unsubscribe(p);
    p.Send("测试取消订阅");

    Console.ReadKey();
}       

image.png

完整代码

//发布者
public class Publisher
{
    //声明事件
    public event Action<string> publishEvent;

    //触发事件
    public void Send(string s)
    {
        publishEvent?.Invoke(s);
    }
}

//订阅者
public class Subscriber
{
    //订阅事件
    public void Subscribe(Publisher publisher)
    {
        publisher.publishEvent += Receive;
    }
    //取消订阅事件
    public void Unsubscribe(Publisher publisher)
    {
        publisher.publishEvent -= Receive;
    }
    //事件对应的方法
    public void Receive(string message)
    {
        Console.WriteLine("订阅者接受:"+message);
    }
}

public class _01_observePattern_event
{
    static void Main()
    {
        Publisher p = new Publisher();
        Subscriber s1  = new Subscriber();
        Subscriber s2  = new Subscriber();

        s1.Subscribe(p);
        s2.Subscribe(p);
        //调用事件
        p.Send("测试订阅");
        s1.Unsubscribe(p);
        p.Send("测试取消订阅");

        Console.ReadKey();
    }       
}

文章参考资料

创作不易,如果您觉得有帮助,请支持LIncol29!
如有需要,请至网站地图学习本博客的教程
博客订阅:通过RSS或关注公众号[Lincol的编程世界] | 广告招租与合作请留言
本文链接:https://www.lincol29.cn/observepattern
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议转载请注明文章地址及作者哦~

评论

  1. xyz
    Windows Chrome
    9 月前
    2024-5-16 13:22:30

    希望可以继续更新后面的设计模式。加油 😱

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇