今天我们来学习一种行为型模式,观察者模式(Observer Pattern)。
模式定义
定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听器(Source-Listener)模式或从属者(Dependents)模式。
模式结构
观察者模式包含如下角色:
**Subject: ** 目标
**ConcreteSubject: ** 具体目标
**Observer: ** 观察者
**ConcreteObserver: ** 具体观察者
UML图
代码实现
Subject.java
/**
* 抽象目标者
*/
public abstract class Subject {
// 保存注册的观察者对象
private List<Observer> mObservers = new ArrayList<>();
//注册观察者对象
public void attach(Observer observer) {
mObservers.add(observer);
System.out.println("Attached an observer");
}
//注销观察者对象
public void detach(Observer observer) {
mObservers.remove(observer);
}
// 通知所有注册的观察者对象
public void nodifyObservers(String newState) {
for (Observer observer : mObservers) {
observer.update(newState);
}
}
}
ConcreteSubject.java
/**
* 具体目标者
*/
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void change(String newState) {
state = newState;
System.out.println("ConcreteSubject State:" + state);
//状态发生改变,通知观察者
nodifyObservers(state);
}
}
Observer.java
/**
* 观察者
*/
public interface Observer {
void update(String state);
}
ConcreteObserver.java
/**
*具体观察者
*/
public class ConcreteObserver implements Observer {
// 观察者状态
private String observerState;
@Override
public void update(String state) {
// 更新观察者状态,让它与目标状态一致
observerState = state;
System.out.println("ConcreteObserver State :" + observerState);
}
}
测试类
public class MyClass {
public static void main(String[] args) {
// 创建目标对象
ConcreteSubject concreteSubject = new ConcreteSubject();
// 创建观察者对象
Observer observer = new ConcreteObserver();
// 将观察者对象注册到目标对象上
concreteSubject.attach(observer);
// 改变目标对象的状态
concreteSubject.change("I change");
}
}
运行结果
模式分析
-
观察者模式描述了如何建立对象与对象之间的依赖关系,如何构造满足这种需求的系统。
-
这一模式中的关键对象是观察目标和观察者,一个目标可以有任意数目的与之相依赖的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。
-
作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通
观察模式的优点
-
观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
-
观察者模式在观察目标和观察者之间建立一个抽象的耦合。
-
观察者模式支持广播通信。
-
观察者模式符合“开闭原则”的要求。
观察模式的缺点
-
如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
-
如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
-
观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
本博客同步发表在 http://hjxandhmr.github.io/2016/06/08/DesignPattern-Observer/
参考
http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html
网友评论