2022年2月17日 作者 zeroheart

观察者模式

观察者模式是典型的用来解耦的,一个被观察对象,可以有多个观察者,对象状态变化,自动触发观察者的通知行为。

实现方式:

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

参考:观察者模式 | 菜鸟教程 (runoob.com)