观察者模式:
定义:
对象间一对多的依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新。
在一对多的关系中,一为被观察者,多为观察者,被观察者依赖观察者。
翻译翻译:被观察者类中有观察者类的基类,通常是一个基类指针容器,而这个基类中需要声明一个访问权限为public的函数(是否纯虚皆可,一般是纯虚函数,如果不需要被子类继承的话也可以不用virtual关键字,直接声明实现),用来在被观察者状态改变时被观察者调用触发观察者们的动作,这个函数一般把函数名写为Update(),默认好读而已,具体如何看项目规范。
类图摘自设计模式之禅:
优点:
观察者与被观察者之间是抽象耦合,易扩展。
形成触发机制,例如:张三抢了李四的钱包,李四告派出所,派出所立案,立案后…这一系列触发都可以用update()封装,再由子类实现,形成多态,一连串的触发,也就形成了广播链。
使用场景:
可拆分的关联行为场景。
事件多级触发。
跨系统消息交换场景,如消息队列的处理机制。
注意点:
广播链逻辑复杂难以维护,不应过长,一个消息传递两次左右较好控制。
广播链与责任链的区别在于广播链的消息随时可更改,责任链的消息不可变或稍作修正。
异步处理:观察者较多,处理时间较长时采用异步,需考虑线程安全和队列的问题,建议看message queue。
项目中的观察者模式:
观察者中的update()方法接收两个参数,一个是被观察者,一个是DTO(Data Transfer Object,据传输对象),DTO一般是个纯洁的JavaBean,由被观察者生成,由观察者消费,考虑到远程传输,一般消息以xml格式传输。
观察者响应方式:异步与同步
情况:观察者接收被观察者传的信息并进行处理,若被观察者较多,观察者为能快速响应,就需要采用同步或异步响应的办法。
同步:使用缓存技术提供足够的资源保证快速响应,好方法,开发难,压力测试得充分。
异步:多线程,不管是被观察者启动线程还是观察者启动线程,都可以显著的提高性能。
同时,在做出回应需要消耗大量资源时,被观察者需要判断是否需要发送消息给观察者,以减少资源的损耗。
身边的观察者模式:
文件系统:在一个 目录下新建立一个文件,这个动作会通知目录管理器增加该目录,并通知磁盘管理器减少1kb空间。