c#事件的发布-订阅模型_C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命...

本文通过C#代码演示了猫抓老鼠的例子,讲解了事件的发布-订阅模型(观察者模式)。首先展示了双向耦合的代码实现,然后通过抽象类和接口改进为观察者模式,降低了耦合度。接着介绍了委托的概念,并用其封装事件,最后引入了事件参数`sender`和`EventArgs`,进一步解耦了猫和老鼠类。
摘要由CSDN通过智能技术生成

使用面向对象的思想 用c#控制台代码模拟猫抓老鼠

我们先来分析一下猫抓老鼠的过程

1.猫叫了

2.所有老鼠听到叫声,知道是哪只猫来了

3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx"

一  双向耦合的代码

首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program

老鼠类的代码如下

//老鼠类

public classRat

{public string Name { get; set; } //老鼠的名字

public Cat MyCat { get; set; } //老鼠遇到的猫//老鼠逃跑的方法

public voidRun()

{

Console.WriteLine(MyCat.Name+

"猫来了,大家快跑!!我是" +Name);//打印出信息 包含了猫的名字和老鼠本身的名字

}//带参和无参构造

publicRat() { }public Rat(stringname, Cat cat)

{this.Name =name;this.MyCat =cat;

}

}

要让猫叫的时候依次打印出老鼠的逃跑方法,需要在Cat类里添加一个存放Rat对象的集合

Cat类的代码如下

public classCat

{public string Name { get; set; } //猫的名字

List list = new List(); //存放Rat对象的集合//为集合增加老鼠

public voidAdd(Rat rat)

{

list.Add(rat);

}//移除

public voidRemove(Rat rat)

{

list.Remove(rat);

}//猫叫的方法

public voidShout()

{

Console.WriteLine("喵喵喵!");//如果集合非空,循环执行每只老鼠的Run()方法

if (list != null)

{foreach (Rat item inlist)

{

item.Run();

}

}

}publicCat() { }public Cat(stringname)

{this.Name =name;

}

}

在Main方法中,我们需要构建几个Rat对象和一个Cat对象,将Rat对象添加到Cat对象的集合中,调用Cat对象的Shout方法

代码如下

static void Main(string[] args)

{//构建一个Cat对象和两个Rat对象 老鼠遇到的猫是构建的cat

Cat cat = new Cat("Tom");

Rat rat1= new Rat("Jerry", cat);

Rat rat2= new Rat("TaoQi", cat);//调用猫类的Add方法添加老鼠对象

cat.Add(rat1);

cat.Add(rat2);//调用猫的Shout方法

cat.Shout();

Console.ReadKey();

}

运行结果如下

这样的代码缺陷很明显,Cat类和Rat类紧密耦合

猫可能不止要抓老鼠 还要抓小鸟

当然不止是猫会抓 也可能狗拿耗子多管闲事

于是我们可以把猫和狗提出来 继承自一个抽象类Pet

抓捕的小动物老鼠和小鸟没有什么关系 但是都能(逃)跑

先不去管小鸟是飞,我们把它们称作 可以跑的 都实现一个IRunable接口

二  观察者 模式(发布-订阅模式)

修改后的代码如下

新增抽象类Pet ,猫类继承自Pet   (猫类的代码变化不大 略去不写

public abstract classPet

{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值