将计算机思维故事化——之设计模式观察者模式

“观察者模式”,这种模式产生的行为效果非常好理解,因为,符合日常生活中的很多现象。

 

【“观察者模式”,发生在“一对多”的依赖关系上,当其中“一”的角色有所改变时,所有依赖于它的“多”的角色,则可以得到通知。】

 

比如,“订阅报纸”,众多客户在报社订阅报纸,一旦报社有报纸更新,客户们都可以行动起来;再比如,“老师向学生们发通知”,众多学生关注着老师,一旦老师发出通知,学生们可以立刻得到消息,并做出相对应的反应。

【所以,“观察者模式”,也称作“发布-订阅模式”,其中,“发布”一端的角色被称作“目标”(subject),“订阅”一端的角色被称作“观察者”(observer),当然,通常是一个“目标”、多个“观察者”。】

 

比如,“老师向同学们发通知”,这种现象很好理解。其中的关键点在于:

 

第一,老师有一个学生名单

 

“老师”和“学生”是两个独立的名词,但是,“老师”却有着一个“学生”的集合,集合里的每一位“学生”都是在“等通知而作反应”的,至于,“老师”用什么方式保存这个集合,倒不是很重要。

【“目标”和“观察者”是独立的类,其中,“目标”类中有一个包含“观察者”的容器,容器可以是数组(Array/ArrayList)、链表(List)或者向量(Vector)等等】

 

第二,“老师发通知”就等于“集合中的所有学生作反应”

 

【“目标”类中定义Notify()函数,用来发通知;“观察者”类中定义Update()函数,用来作反应;所以,“目标”类的Notify()函数,就是循坏依次调用容器内“观察者”类的Update()函数。

 

第三,老师应该对名单有修改权

 

老师可以在名单中增加某个学生,也可以在名单中剔除某个学生。

【“目标”类需要再定义两个函数,一个用来:在容器中增加“观察者”;一个用来:在容器中移除某个“观察者”。】

 

这个模式的好处在哪里?

 

第一,老师只需要“通知一遍”,所有在集合里的学生都可以“作反应”

 

【这叫“广播”,“目标”既不需要关心有多少个“观察者”,也不需要依次去通知,只需要调用一次Notify()函数,就等于所有注册的“观察者”都执行了Update()函数】

 

 

第二,这样的机制可以复制,做到“依次通知”。“老师”有一个“学生”的名单,可以通知各个“学生”,那么,“学生”也有一个“亲人”名单,再去通知“亲人”。

 

【这叫“触发链”,类A充当“目标”,通知给类B的时候,类B充当“观察者”,但同时,类B也可以是“目标”,在通知给类C,以此类推,这样一种触发机制,可以将一个个简单的类,串在一起,形成了一个触发链。】

 

第三,也是最重要的一点:互不影响

 

老师可以有多位,比如,“老师1”、“老师2”等,学生也可以有多位,“学生甲”、“学生乙”、“学生丙”等。

 

所以,“老师1”中可以有一个名单,“老师2”中也可以有一个名单,这两个名单的内容互不影响,甚至可以包含相同的学生;同理,“学生甲”可以作甲类型反应、“学生乙”可以作乙类型反应,“学生丙”可以做丙类型反应,各学生的反应各不影响

 

总之,老师和老师之间相互独立、学生与学生之间相互独立。

 

 

如果需要加老师,则继续加老师即可,对已有老师不产生影响;如果需要加学生,则继续加学生即可,对已有学生不产生影响。

 

【“老师”和“学生”都是抽象的、笼统的概念,这样一种在抽象概念之间建立的联系,称为“抽象耦合”。因为抽象耦合,所以,不管是“目标”类还是“观察者”类,都变得非常容易扩展。

 

 

 

 

 

* 思维碰撞,不要忘了与好友分享!未来将推出“将计算机思维故事化”系列,谢谢大家的关注!*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值