右击解决方案或解决方案下文件夹--->添加---->新建项目---->Visual C#--->控制台应用程序
观察者:
Baby.cs
using System;
namespace ConsoleApp3
{
/// <summary>
/// 观察者
/// </summary>
public class Baby
{
public void cry() {
Console.WriteLine("宝宝哭....");
}
}
}
Dog.cs
using System;
namespace ConsoleApp3
{
/// <summary>
/// 观察者
/// </summary>
public class Dog
{
public void Wang() {
Console.WriteLine("狗叫,汪汪汪");
}
}
}
Mom.cs
using System;
namespace ConsoleApp3
{
/// <summary>
/// 观察者
/// </summary>
public class Mom
{
public void clap() {
Console.WriteLine("妈妈拍拍宝宝,哄入睡");
}
}
}
Mouse.cs
using System;
namespace ConsoleApp3
{
public class Mouse
{
/// <summary>
/// 观察者
/// </summary>
public void run() {
Console.WriteLine("老鼠跑");
}
}
}
消息发布者:
Cat.cs
using System;
namespace ConsoleApp3
{
/// <summary>
/// 广播者
/// </summary>
public class Cat
{
/// <summary>
/// 耦合性太强,猫类只是叫了一声,其他的动作与猫没有多大关系,不应该写在猫类里
/// </summary>
public void miao() {
Console.WriteLine("小猫喵的一声....");
new Mouse().run();
new Dog().Wang();
new Baby().cry();
new Mom().clap();
}
public Action miaoAction;
/// <summary>
/// 基于委托实现,缺陷是:外部可以=null,不安全,将其他的订阅者消息给覆盖了
/// </summary>
public void miaoAct() {
Console.WriteLine("小猫喵的一声....");
if (miaoAction != null) {
miaoAction.Invoke();
}
}
public event Action miaoEvent;
/// <summary>
/// 基于事件实现,最推荐的写法
/// </summary>
public void miaoEven() {
Console.WriteLine("小猫喵的一声....");
if (miaoEvent != null)
{
miaoEvent.Invoke();
}
}
}
}
触发事件,调用:
Program.cs
using System;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
Console.WriteLine("=========原始做法:耦合性太强,猫类只是叫了一声,其他的动作与猫没有多大关系,不应该写在猫类里==========");
{
cat.miao();
}
//使用委托,订阅者就可以使用 = 来对委托对象重新赋值(其它订阅者全部被取消订阅),甚至将其设置为null,甚至订阅者还可以直接调用委托,这些都是很危险的操作,广播者就失去了独享控制权
Console.WriteLine("=========基于委托的做法: 基于委托实现,缺陷是:外部可以=null,不安全,将其他的订阅者消息给覆盖了===========");
{
//订阅事件
cat.miaoAction += new Mouse().run;
cat.miaoAction += new Dog().Wang;
cat.miaoAction += new Baby().cry;
cat.miaoAction += new Mom().clap;
//触发事件
cat.miaoAct();
cat.miaoAction = null;
cat.miaoAct();
}
//事件有一系列规则和约束用以保证程序的安全可控,事件只有 += 和 -= 操作,这样订阅者只能有订阅或取消订阅操作,没有权限执行其它操作,事件保证了程序的安全性和健壮性
Console.WriteLine("=========使用事件,推荐用法===========");
{
//订阅事件
cat.miaoEvent += new Mouse().run;
cat.miaoEvent += new Dog().Wang;
cat.miaoEvent += new Baby().cry;
cat.miaoEvent += new Mom().clap;
//触发事件
cat.miaoEven();
Console.WriteLine("============取消订阅:-= new Baby().cry;-= new Mom().clap;=================");
//取消订阅
cat.miaoEvent -= new Baby().cry;
cat.miaoEvent -= new Mom().clap;
cat.miaoEven();
}
Console.Read();
}
}
}
运行结果: