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