设计模式之观察者模式, 个人感觉相当的重要(七)
原文地址:点击就送
观察者模式: (又被成为发布订阅模式, 模型-视图模式, 源-收听者模式或从属者模式) 是软件设计模式的一种. 在这种模式中, 一个目标物件管理所有依赖于他的观察者物件, 并且在它本身的状态改变时, 主动发出通知. 这通常透过呼叫各观察者所提供的方法来实现. 此种模式通常被用来视作事件处理系统.
UML
在jdk中有 观察者模式的例子
- Observer观察者接口
- 被观察者类 Observable
- 被观察者发生改变时会通知观察者
观察者模式: 总体上被分为两种
- 发布-订阅类的问题处理
- 事件驱动模型: 类似web开发的监听器
- ps:补充一下序列化 key 地址改变, 反序列不会调用构造等
事件驱动模型
- jdk中自带 EventListener 事件监听接口
- 其中的 Object被transient修饰 ps序列化的相关知识
这两种代码上的区别
- 发布订阅: 被观察者需要继承Observable, 观察者需要实现Observer
- 事件驱动模型: 主动方需要实现 WriterListener[]
总结:
- 这两种模型达到的效果看上去是一样的, 观察者模式更加贴近现实业务, 事件驱动比观察者不用的地方
- 观察者模式中理论上针对被观察者的动作是唯一的, 尽管update中有两个参数 一个是对象 一个算是标识, 在监听者模式中算是自定义的 - 注意点实际动作都是由监听者来实现的, 被监听者调用
- 事件驱动更加的灵活, 但是系统复杂度作为代价, 也就是由事件源自己来维护监听队列
- 观察者模式的局限性: 如果被观察者原来就有父类, 尽管可以用适配器模式, 但是事件驱动事件源的监听列表是自己维护的
- 观察者模式中, 只能用update来触发对应的操作, 尽管有第二个参数作为双方约定, 事件驱动的信息都是封装在event中由监听者自己来定义, 监听者明白自己想要什么
文中最后举了一个类子, 感冒了脑袋有点晕,自我总结下
- button是触发事件的媒介, 需要注册点击事件(监听+具体实现), 比如双击这个操作, 用户双击, 事件发生
整个观察者模式主要分为两大块
- 观察者模式: 发布--订阅, 变化--更新
- 事件驱动模型: 请求--响应, 事件发生--事件处理
- 也就是应用场景经典代表作者与读者, 按钮事件