51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

【设计模式】CSharp实现行为型模式之-观察者模式

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

本文 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(&quot;Hello world&quot;);
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&lt;IObserver&gt; observerList = new List&lt;IObserver&gt;(); 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(&quot;Hello world&quot;);
    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(&quot;测试订阅&quot;);
s1.Unsubscribe(p);
p.Send(&quot;测试取消订阅&quot;);

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(&quot;测试订阅&quot;);
    s1.Unsubscribe(p);
    p.Send(&quot;测试取消订阅&quot;);
Console.ReadKey();

}

}


文章参考资料

赞(2)
未经允许不得转载:工具盒子 » 【设计模式】CSharp实现行为型模式之-观察者模式