https://www.cnblogs.com/abcdwxc/archive/2007/10/30/942834.html(C#设计模式(23种设计模式))
https://ke.qq.com/course/28986
观察者模式
【日常应用1】
比如是群主,在群里面发了一条通知。群里面在100个人看到这条消息后,会做出应对,或者执行这条消息,或者忽略这条消息等等。
【日常应用2】
比如生活中猫叫一了一声,老鼠听到后就跑掉、孩子听到之后就会哭、狗听到之后就会叫。。。。(老鼠、孩子、狗等等就是观察者)
猫内部有这些对象。我们希望在猫这个方法的内部,尽可能的少变动代码。比如再来一个小偷,小偷听到声音后,就会隐藏:
你可能会注意到,这样的代码扩展性太差,每次我们扩展一个功能时(比如增加一个小偷对象), 都要修改猫的方法。这样的代码可扩展性太差了。同样的,若是我们调整狗叫、老鼠逃跑等等功能的顺序,程序是需要多次修改的,很不稳定。
因为猫的这个类,依赖的太多的内部类(狗类等等),导致可扩展性、不稳定。那么如何提高猫这个类的可扩展性、稳定性呢?
定义一个接口即可,这个接口有个抽象的Action方法。然后在每个狗啊,老鼠等等对象中,实现Action方法。那么Action方法里面怎么实现呢,请看下面的截图:
其实,在上面的几个截图中,我们把所有的动作都封装在了集合_ObserverList中。那么我们在主程序里面,该如何通过集合快速的增删功能动作、或者为不同的功能排序呢?
你可以看看,如何我们需要添加一个Brother对象,我们可以在主程序进行初始化即可。而不需要变动其他类,这样更方便、更快。
以上就是增加或变动动作顺序的功能。
若是我想删除一个动作呢,怎么办?
好了,我们在主程序中,把这个删除函数用起来:
好了,我们要定义多个猫,并且每个猫有不同的动作,怎么办呢?
好了,我们也可以定义事件,通过事件添加方法来执行动作。
那么,事件的写法有什么好处呢?它可以很方便为我们添加多个对象的方法,比如多个狗的方法。 比如再添加一个狗。