设计模式之观察者模式
观察者模式,也称发布订阅模式,是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生了改变时,其所有依赖对象都会收到通知并自动更新。我们就可以简单地称这一个被依赖的对象为被观察者,多个依赖对象为观察者。
其实概括性地讲,设计模式要干的事情就是解耦。创建型模式是将创建和使用的代码解耦,结构型模式是将不同功能的代码解耦,行为型模式是将不同行为的代码进行解耦。而具体到观察者模式就是将观察者和被观察者的代码进行解耦。这也是观察者模式要解决的问题,在解决一个对象改变给其他对象通知的问题时,既要考虑到易用和低耦合,又要保证高度的协作。
那么该怎么解决呢,可以通过面向对象的手段将依赖的关系进行弱化。那又该如何做呢,那就不得不先指出观察者模式中的核心角色了:
- 主题(Subject):也可以称之为可观察者和被观察者。它是一个具有状态的对象,维护一个观察者列表,提供添加、删除、通知观察者的方法;
- 观察者(Observer):接收主题通知的对象。实现一个更新方法,当接受通知时,进行更新操作。
- 具体主题(Concreate Subject):主题的具体实现类。
- 具体观察者(Concreate Observer):观察者的具体实现类。
这里再附上一张UML类图,来将这四者的关系表达更加明确一些:

在这里,或许你就会明白所谓的靠面向对象的手段将依赖的关系进行弱化,实则就是使用继承和多态将具体的主题和具体的观察者进行解耦。这样,当我们想要改变某个类的具体逻辑,或是增加一个观察者时,就不需要去动主题中的代码了。这也是观察者模式的优点:观察者和被观察者是抽象耦合的。接下来我再给出一份代码样例,还是经典的猫捉老鼠的案例:
/**
* 主题类
*/
public abstract class Subject {
private List<Observer> observers = new ArrayList<Observer>();
private int state;
// 用于增加观察者
public abstract void attach(Observer obs);
// 用于删除观察者
public abstract void detach(Observer obs);
// 用于通知观察者
public abstract void notify();
public abstract int getState();
public abstract void setState(int state);
}
/**
* 观察者类
*/
public interface Observer {
public void update();
}
/**
* 具体的主题类,以老鼠为例
*/
public class Mouse extends Subject {
private List<Observer> obsevers = new ArrayList<Observer>();
private int state;
public void attach(Observer

本文介绍了观察者模式,它是一种行为型设计模式,可将观察者和被观察者代码解耦。文中阐述了其核心角色、优缺点及不同实现方式,还介绍了EventBus框架的使用和原理。最后对比了观察者模式和监听器模式,指出监听器模式是其扩展。

1345

被折叠的 条评论
为什么被折叠?



