2022年2月17日
观察者模式
观察者模式是典型的用来解耦的,一个被观察对象,可以有多个观察者,对象状态变化,自动触发观察者的通知行为。
实现方式:
1.被观察对象
需要有一个(多个)状态、需要有一个增加观察者的功能(订阅)、需要一个通知的方法
2.观察者是一个抽象类,需要有一个通知的方式
3.多个不同的观察者继承抽象类,实现通知方法,做不同的动作
4.例子,来自文末的笔记
观察者抽象类:
public abstract class Observer {
public abstract void update(String msg);
}
第一个观察者:
public class F_Observer extends Observer {
public void update(String msg) {
System.out.println(F_Observer.class.getName() + " : " + msg);
}
}
第二个观察者:
public class S_Observer extends Observer {
public void update(String msg) {
System.out.println(S_Observer.class.getName() + " : " + msg);
}
}
第三个观察者:
public class T_Observer extends Observer {
public void update(String msg) {
System.out.println(T_Observer.class.getName() + " : " + msg);
}
}
被观察者:
public class Subject {
private List<Observer> observers = new ArrayList<>(); //状态改变
public void setMsg(String msg) {
notifyAll(msg);
}
//订阅
public void addAttach(Observer observer) {
observers.add(observer);
}
//通知所有订阅的观察者
private void notifyAll(String msg) {
for (Observer observer : observers) {
observer.update(msg);
}
}
}
使用方法:
public class Main {
public static void main(String[] args) {
F_Observer fObserver = new F_Observer();
S_Observer sObserver = new S_Observer();
T_Observer tObserver = new T_Observer();
Subject subject = new Subject();
subject.addAttach(fObserver);
subject.addAttach(sObserver);
subject.addAttach(tObserver);
subject.setMsg("msg change");
}
}
运行结果: test.F_Observer : msg changetest.S_Observer : msg changetest.T_Observer : msg change