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



`}
`

文章参考资料

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