观察者模式(Observer Pattern)也被称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式,是在 GoF 23 种设计模式中定义了的行为型模式。
观察者模式 定义了一对多的关系,让多个观察者对象同时监听某一个主体对象,这个主体对象发生变化时就会通知所有的观察者对象,使得他们能够自己更新自己。
~
本片文章内容包括:关于观察者模式、观察者模式 Demo(伪代码)
观察者模式(Observer Pattern)也被称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式,是在 GoF 23 种设计模式中定义了的行为型模式。
观察者模式 定义了一对多的关系,让多个观察者对象同时监听某一个主体对象,这个主体对象发生变化时就会通知所有的观察者对象,使得他们能够自己更新自己。
观察者模式的特点:
被观察者不知道具体的观察者是谁,只知道自己被观察了,并且在合适的时机进行广播,让感兴趣的观察者知道发生了什么事情;
观察者依赖于被观察者,被观察者不依赖于观察者,是单向关系,耦合程度不高。没有被观察者,观察者无法工作;没有观察者,被观察者该干啥干啥,因为被观察者本来就不清楚谁观察他,发广播是被观察的个人行为;
通常被观察者出现行为上的变化,需要观察者做出反馈。显然一般情况下观察者并不知道被观察者啥时候会有变化,因此该反馈是一种被动反馈,实现的是一种回调机制。
策略模式主要由 4 种角色构成:
notify()
。目标类可以是接口,也可以是抽象类或具体类。update()
,因此又称为抽象观察者。update()
方法。通常在实现时可以调用具体目标类的 attach(
) 方法将自己添加到目标类的集合中或者通过 detach()
方法将自己从目标类的集合中删除。# 观察者模式的优点
# 观察者模式的缺点:
# Subject 目标
import java.util.List;
import java.util.ArrayList;
public abstract class Subject {
/**
* 定义一个观察者集合用于存储所有观察者对象
*/
protected List<Observer> observers = new ArrayList<Observer>();
/**
* 注册方法,用于向观察者集合中增加一个观察者
* @param observer Observer
*/
public void attachObserver(Observer observer) {
observers.add(observer);
}
/**
* 注销方法,用于在观察者集合中删除一个观察者
* @param observer Observer
*/
public void detachObserver(Observer observer) {
observers.remove(observer);
}
/**
* 声明抽象通知方法
*/
public abstract void notifyObserver();
}
# ConcreteSubject 具体目标
public class ConcreteSubject extends Subject {
/**
* 实现通知方法
*/
@Override
public void notifyObserver() {
//遍历观察者集合,调用每一个观察者的响应方法
for(Observer obs:observers) {
obs.update();
}
}
}
# Observer 观察者
public interface Observer {
/**
* 声明响应方法
*/
public void update();
}
# ConcreteObserver 具体观察者
public class ConcreteObserverA implements Observer {
/**
* 实现响应方法
*/
@Override
public void update() {
//具体响应代码
System.out.println("ConcreteObserverA 相应");
}
}
public class ConcreteObserverB implements Observer {
/**
* 实现响应方法
*/
@Override
public void update() {
//具体响应代码
System.out.println("ConcreteObserverB 相应");
}
}
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
subject.attachObserver(new ConcreteObserverA());
subject.attachObserver(new ConcreteObserverB());
subject.notifyObserver();
}
}