
首先我们定义一个场景,地球上由于食物链的存在,生物便有了猎食和被猎食的命运。那么我我这里用猫抓老鼠的场景,用简单的程序来实现一个简单的观察者模式。
猫咪作为一个被观察者,而老鼠们则作为观察者,当被观察者,即猫咪开始活动的时候,老鼠们就要开始逃命了。
这里先创建一个猫的类,给定猫特有的属性和一个活动的方法,下面的代码都用控制台的方式来呈现猫和老鼠的活动状态。
猫的类:
namespace 类中声明了一个Action的委托。
老鼠的类:
最后是Main方法开始调用
namespace 输出的结果:

如果我们这里不用到委托,单纯在Cat类里调用cat的Move方法同时,也要在方法里创建老鼠的对象并调用方法,假如每增加多一个老鼠,那么就要在cat的Move方法的基础上再进行修改,非常的不人性化。这里我们用到委托后,开发好Cat的方法后就不再需要动它了。方便维护代码。做到解耦的作用,减少程序的复杂性,也提高了可读性。
接下来可以用事件来优化一下这个观察者的设计模式。
事件:
概念:事件基于委托,为委托提供了一个发布/订阅机制,可以说事件是一种具有特殊签名的委托。
事件(event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托。
事件的声明:
- public event 委托类型 事件名
- 事件使用event关键字来声明,它的返回类是一个委托类型。
- 通常事件命名,以名字+Event作为他的名称,在编码中尽量使用规范命名,增加代码的可读性。
注意点:事件不能在类的外部触发,只能在类的内部触发。
事件与委托的联系和区别
- 事件是一种特殊的委托,或者说是受限制的委托,是委托的一种特殊应用,只能施加+=,-=操作符。二者本质上是一个东西。
- event ActionHandler Tick;编译成创建一个私有的委托示例,和施加在其上的add,remove方法,就是上面说的+=,-=..
- event 只允许用add,remove方法来操作,这导致了它不允许在类的外部被直接触发,只能在类的内部合适的实机触发。
使用中,委托常用来表达回调,事件表达外发的接口。
下面我们看看用事件来实现观察者模式。
猫的类:
namespace 老鼠类:
namespace Main方法:
namespace 输出结果:

结果没问题。
本文通过猫捉老鼠的游戏场景,详细介绍了观察者模式的实现过程。首先定义了猫和老鼠两个类,并利用委托的方式实现了猫活动时老鼠逃跑的行为。进一步通过事件优化了观察者模式,使代码更易于维护。
678

被折叠的 条评论
为什么被折叠?



