观察者模式

日常生活中,当我们订阅了报纸后,每天早上报社都会把报纸送到家门口;取消订阅后,报社将不再给我们提供送报纸的服务了;我们把这样的场景可以理解为观察者模式:

1. 观察者(Obersver),享受服务者,它可以订阅多个服务(主题);当主题发生变化时,会自动给观察者发送消息;

2. 主题(Subject),服务提供者,可以为多个观察者提供服务;接受观察者的订阅与取消订阅操作;并同时为订阅者提供服务;

优点:

主题与观察者之间高度解耦,是多对多的关系;增加主题或是观察者都对已有的代码没有影响。

观察者订阅主题的方式:

observer.register(subject);

观察者删除主题的方式:

observer.remove(subject);

参考代码(JAVA版)

public interface Observer {
    public void update(float temp, float humidity, float pressure);
    
    public void register(Subject sub);
    
    public void remove(Subject sub);
}
public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();
    public void updateData(float temp, float huidity, float pressure);
}    
public class WeatherObserver implements Observer{
    
    private float temp;
    private float humidity;
    private float pressure;
    
    
    @Override
    public void update(float temp, float humidity, float pressure) {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        
        System.out.println(this.toString());
    }

    public WeatherObserver(){
    }

    
    @Override
    public String toString() {
        return "WeatherObserver [temp=" + temp + ", humidity=" + humidity + ", pressure=" + pressure + "]";
    }

    @Override
    public void register(Subject sub) {
        sub.registerObserver(this);
    }

    @Override
    public void remove(Subject sub) {
        sub.removeObserver(this);
    }
    
    
}
import java.util.LinkedList;
import java.util.List;

public class WeatherSubject implements Subject {

    private List<Observer> observerList;
    private float temp;
    private float humidity;
    private float pressure;
    
    public WeatherSubject(){
        this.observerList = new LinkedList<Observer>();
    }
    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);
        
    }

    @Override
    public void removeObserver(Observer o) {
        if( observerList.contains(o)){
            observerList.remove(o);
        }
        
    }

    @Override
    public void notifyObserver() {
        int size = observerList.size();
        for(int i = 0; i < size; i++){
            observerList.get(i).update(temp, humidity, pressure);
        }
        
    }

    public void updateData(float temp, float huidity, float pressure){
        this.temp = temp;
        this.humidity = huidity;
        this.pressure = pressure;
    }
}
public class Main {

    public static void main(String[] args) {

        Subject weatherSubject = new WeatherSubject();
        
        Observer weatherObs = new WeatherObserver();

        weatherObs.register(weatherSubject);
        
        weatherSubject.updateData(10, 20, 30);
        weatherSubject.notifyObserver();
        
        weatherObs.remove(weatherSubject);
        weatherSubject.updateData(10, 20, 30);
        weatherSubject.notifyObserver();
        
        weatherSubject.updateData(10, 20, 30);
        weatherSubject.notifyObserver();
    }

}
原文地址:https://www.cnblogs.com/ordili/p/6531929.html