1700469575
设计模式之禅 22.3 观察者模式的应用
1700469576
1700469577
22.3.1 观察者模式的优点
1700469578
1700469579
❑观察者和被观察者之间是抽象耦合
1700469580
1700469581
如此设计,则不管是增加观察者还是被观察者都非常容易扩展,而且在Java中都已经实现的抽象层级的定义,在系统扩展方面更是得心应手。
1700469582
1700469583
❑建立一套触发机制
1700469584
1700469585
根据单一职责原则,每个类的职责是单一的,那么怎么把各个单一的职责串联成真实世界的复杂的逻辑关系呢?比如,我们去打猎,打死了一只母鹿,母鹿有三个幼崽,因失去了母鹿而饿死,尸体又被两只秃鹰争抢,因分配不均,秃鹰开始斗殴,然后羸弱的秃鹰死掉,生存下来的秃鹰,则因此扩大了地盘……这就是一个触发机制,形成了一个触发链。观察者模式可以完美地实现这里的链条形式。
1700469586
1700469587
1700469588
1700469589
1700469590
设计模式之禅 22.3.2 观察者模式的缺点
1700469591
1700469592
观察者模式需要考虑一下开发效率和运行效率问题,一个被观察者,多个观察者,开发和调试就会比较复杂,而且在Java中消息的通知默认是顺序执行,一个观察者卡壳,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。
1700469593
1700469594
多级触发时的效率更是让人担忧,大家在设计时注意考虑。
1700469595
1700469596
1700469597
1700469598
1700469599
设计模式之禅 22.3.3 观察者模式的使用场景
1700469600
1700469601
❑关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”关系。
1700469602
1700469603
❑事件多级触发场景。
1700469604
1700469605
❑跨系统的消息交换场景,如消息队列的处理机制。
1700469606
1700469607
1700469608
1700469609
1700469610
设计模式之禅 22.3.4 观察者模式的注意事项
1700469611
1700469612
使用观察者模式也有以下两个重点问题要解决。
1700469613
1700469614
❑广播链的问题
1700469615
1700469616
如果你做过数据库的触发器,你就应该知道有一个触发器链的问题,比如表A上写了一个触发器,内容是一个字段更新后更新表B的一条数据,而表B上也有个触发器,要更新表C,表C也有触发器……完蛋了,这个数据库基本上就毁掉了!我们的观察者模式也是一样的问题,一个观察者可以有双重身份,既是观察者,也是被观察者,这没什么问题呀,但是链一旦建立,这个逻辑就比较复杂,可维护性非常差,根据经验建议,在一个观察者模式中最多出现一个对象既是观察者也是被观察者,也就是说消息最多转发一次(传递两次),这还是比较好控制的。
1700469617
1700469618
注意 它和责任链模式的最大区别就是观察者广播链在传播的过程中消息是随时更改的,它是由相邻的两个节点协商的消息结构;而责任链模式在消息传递过程中基本上保持消息不可变,如果要改变,也只是在原有的消息上进行修正。
1700469619
1700469620
❑异步处理问题
1700469621
1700469622
这个EJB是一个非常好的例子,被观察者发生动作了,观察者要做出回应,如果观察者比较多,而且处理时间比较长怎么办?那就用异步呗,异步处理就要考虑线程安全和队列的问题,这个大家有时间看看Message Queue,就会有更深的了解。
1700469623
[
上一页 ]
[ :1.700469574e+09 ]
[
下一页 ]