观察者模式(Obserer Pattern)又叫做发布订阅模式(Publish/subscribe)。其定义如下:
Define a one-to many dependency between objects so that when one object changes state,all its dependents are notified and update automatically.
定义一个一对多依赖的对象,这样使得这个对象的状态发生变化时,所有他依赖的对象都将被通知并自动更新。
通用类图如下:
12.png
具体角色定义如下:
1、Subject:主题,被观察者,发布者,定义被观察者必须实现的职责,必须能够动态的增加观察者,删除观察者,管理观察者并通知观察者。
2、ConcreteSubject:具体的观察者,出了拥有最基本的观察者的职责外,可以定义自己的业务逻辑
3、Observer:观察者,被通知对象,定义收到通知后的动作,具体动作实现交由具体的观察者
4、ConcreteObserver:具体的观察者,实现观察者定义的收到通知的动作。
观察者模式的优点:
1、观察者和被观察者之间是抽象耦合:这样不管是增加观察者还是增加被观察者,都是非常容易的,便于扩展。
2、建立了一套触发机制
观察者模式的缺点:
1、需要考虑开发效率和运行效率,尤其是一个观察者多个被观察者时。适当时可以考虑异步机制。
观察者模式使用场景:
1、关联行为场景:关联行为必须是可拆分的,而不是组合关系
2、事件多级触发场景
3、跨系统的消息交还场景
观察者模式的注意问题:
1、广播链问题:一个观察者可以有多重身份,也就是说既可以是观察者,也可以是被观察者,这样性能、可维护性都比较差,链路较长,容易形成闭环。
2、异步处理问题:如果在多个观察者中,中间某一个观察者处理时间较长,就会影响其后的观察者的处理,可以适时的考虑异步,这就需要考虑线程安全和队列的问题。
扩展:
在java中jdk已经实现了Oberverable的被观察这类和Oberver的观察者接口,我们在定义自己的观察者和被观察者时可以继承和实现他们。
网友评论