Define a one-to-many dependency between objects so that when one objects changes state, all its dependents are notified and updated automatically.(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)
观察者模式介绍
观察者,也被称作依赖或者发布订阅,是在项目中经常用到处理事件的一种模式。观察者的通用类图如下:
常见的以下都是观察者模式的实现:
- Observer
- Listener
- Hook
- Callback
- …
观察者模式分析
优点:
缺点:
- 因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。
- 然后又是效率问题了,开发效率以及运行效率方面都有可能存在问题,一个被观察者,多个观察者,开发调试比较复杂,而且一个观察者卡壳,其它观察者也会被影响。
- 另外多级触发的效率也需要考虑到。
观察者模式之实现
Golang
Java
public interface Obeservable{
//增加观察者
public void addObserver(Observer observer);
//删除观察者
public void deleteObserver(Observer observer);
//发生改变通知观察者
public void notifyObservers(String context);
}
这个是通用的观察者接口,所有的观察者都可以实现这个接口,接下来是小贤的接口:
public class ZengXiaoXian implements IZengXiaoXian,Obserable{
//定义动态数组存放不同媒体的狗仔队
private ArrayList<Observer> observerList = new ArrayList<>();
//增加观察者
public void addObserver(Observer observer){
this.observerList.add(observer);
}
//删除观察者
public void deleteObserver(Observer observer){
this.observerList.remove(observer);
}
//发生改变通知观察者
public void notifyObservers(String context){
for (Observer observer : observerList ) {
observer.update(context);
}
}
//吃饭
public void eat(){
System.out.println("曾小贤要吃饭了");
this.notifyObservers("曾小贤要吃饭了");
}
//睡觉
public void sleep(){
System.out.println("曾小贤要睡觉了");
this.notifyObservers("曾小贤要睡觉了");
}
//玩
public void play(){
System.out.println("曾小贤要玩耍了");
this.notifyObservers("曾小贤要玩耍了");
}
}
被观察者已经实现了,然后是观察者的实现,首先依然是观察者的接口:
public interface Observer{
//发现被观察的人有动静,就开始准备写稿子,整头条什么的
public void update(String context);
}
然后就是狗仔队的实现了,狗仔队一号出动:
public class Paparazzo1 implements Observer{
//狗仔队一号一旦发现有什么爆料,就告诉老板
public void update(String str){
System.out.println("观察到曾小贤和张子萱拥吻,开始汇报");
this.reportToXX(str);
}
//汇报给XX媒体
private void reportToXX(String context){
System.out.println("老大,我看到"+context);
}
}
如果你还想要其它狗仔队请自行实现Paparazzo2、3等等等等,那么我们用一个场景类来实现当时的现场情况:
public class Client{
public static void main(String[] args) {
//出来一个狗仔队
Observer paparazzo = new Paparazzo();
//曾小贤出场
ZengXiaoXian zengxiaoxian = new ZengXiaoXian();
zengxiaoxian.addObserver(paparazzo);
//看看曾小贤在干嘛
zengxiaoxian.eat();
zengxiaoxian.play();
zengxiaoxian.sleep();
}
}
观察者模式之应用场景
- 当一个抽象模型有两个方面,其中一个依赖于另一个方面。
- 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。