定义
什么是观察者模式?它的作用是什么?
当一个对象状态发生了变化,订阅它的其他对象收到通知并作出相应变化。
作用是减少依赖关系,解耦合。
通俗的例子就是报纸的运作模式,或者服务大厅的叫号。
- Subject(抽象主题): 一个可观察的接口,通知观察者使用attach方法,以及取消观察的detach方法。
- ConcreteSubject(具体主题): 是一个实现主题接口的类,处理观察者的变化
- Observer(抽象观察者): 一个通知订阅者的接口,根据主题中的更改而进行更新。
- ConcreteObserver(具体观察者):根据观察者改变做出具体改变。
代码示例
抽象主题
public interface Subject {
// 添加订阅关系
void attach(Observer observer);
// 移除订阅关系
void detach(Observer observer);
// 通知订阅者
void notifyObservers(String message);
}
抽象订阅者
public interface Observer {
// 处理更新业务逻辑
void update(String message);
}
具体主题:人民日报
// 人民日报
public class RenMinRiBao implements Subject{
// 维护读者的容器
private List<Observer> readers = new ArrayList();
@Override
public void attach(Observer observer) {
readers.add(observer);
}
@Override
public void detach(Observer observer) {
readers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : readers){
observer.update(message);
}
}
}
具体订阅者:读者
public class Reader implements Observer{
// 读者姓名
private String name;
Reader(String name){
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + "读到了《" + message + "》");
}
}
测试类
public class ObserverTest {
public static RenMinRiBao renMinRiBao = new RenMinRiBao();
public static void main(String[] args) {
Reader liHua = new Reader("liHua");
Reader liBai = new Reader("liBai");
renMinRiBao.attach(liHua);
renMinRiBao.notifyObservers("床前明月光");
renMinRiBao.attach(liBai);
renMinRiBao.notifyObservers("疑是地上霜");
}
}
输出结果
liHua读到了《床前明月光》
liHua读到了《疑是地上霜》
liBai读到了《疑是地上霜》