本文最后更新于91 天前,其中的信息可能已经过时,如有错误请发送邮件到2289035571@QQ.COM
感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请支持LIncol29!
观察者模式
处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,观察者模式也被称为发布/订阅模式
观察者模式写法
一、接口
- 抽取出一个IOberserver接口
/// <summary>
/// 抽取出一个接口
/// </summary>
public interface IOberserver
{
void Invoke();
}
- 被观察者类实现,通知到继承IObersever接口的所有观察者。将观察者对象放入IOberserver集合中。将集合中的对象foreach调用
/// <summary>
/// 被观察者
/// </summary>
public class Subject
{
/// <summary>
/// 实现的具体操作方法
/// </summary>
public void Func()
{
Console.WriteLine("目标发送信息");
//通知到继承IOberserver的所有类
foreach (Observer observer in _oberserverList)
{
observer.Invoke();
}
}
public List<IOberserver> _oberserverList = new List<IOberserver>();
public void Add(IOberserver oberserver)
{
_oberserverList.Add(oberserver);
}
public void Remove(IOberserver oberserver)
{
_oberserverList.Remove(oberserver);
}
}
- 观察者类的实现,继承IOberserver接口,实现Invoke方法
/// <summary>
/// 观察者类,继承IOberserver接口,实现Invoke方法
/// </summary>
public class Observer : IOberserver
{
/// <summary>
/// 实现的接口方法
/// </summary>
public void Invoke()
{
this.Observe();
}
/// <summary>
/// 观察者的操作或响应
/// </summary>
public void Observe()
{
Console.WriteLine("正在观察中");
}
}
- Main方法
static void Main(string[] args)
{
Subject subject = new Subject();
Observer observer = new Observer();
subject.Add(observer);
subject.Func();
Console.ReadKey();
}
二、事件
使用事件去处理,与这个案例类似(发送者相当于主窗体,接受者相当于从窗体)。 其中观察者相当于发送者,被观察者相当于接受者
- 被观察者类
/// <summary>
/// 被观察者
/// </summary>
public class Subject
{
//定义触发事件
public event Action InvokeEvent;
/// <summary>
/// 实现的具体操作方法
/// </summary>
public void Func()
{
Console.WriteLine("目标发送信息");
//事件不为NULL才触发
if (InvokeEvent != null)
{
InvokeEvent.Invoke();
}
}
}
- 观察者类中定义与事件签名相同的响应方法
/// <summary>
/// 观察者类
/// </summary>
public class Observer
{
/// <summary>
/// 观察者的操作或响应
/// </summary>
public void Observe()
{
Console.WriteLine("正在观察中");
}
}
- Main方法使用,观察者订阅被观察者的事件。触发事件
static void Main(string[] args)
{
Subject subject = new Subject();
Console.WriteLine("==================第二种写法使用事件=================");
//观察者订阅被观察者的事件
subject.InvokeEvent += new Observer().Observe;
//触发事件
subject.Func();
Console.ReadLine();
}
希望可以继续更新后面的设计模式。加油 😱