处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,观察者模式也被称为发布/订阅模式。
本文 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();
`}
`
输出如下:
完整代码
//定义主题接口
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();
`}`
`
`
完整代码
//发布者
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();
}
`}
`
文章参考资料
- C#文章集合:更全面的C#知识点文章
- 【设计模式】C#实现结构型模式之-适配器模式:结构型模式------适配器模式
- 【设计模式】C#实现行为型模式之-策略模式:行为型模式------策略模式
- 【设计模式】C#实现创建型模式之-简单工厂、工厂方法、抽象工厂模式:创建型模式------工厂模式