观测者模式

组成部分:

观测者:Observer,也称它为订阅者,即Subscriber
被观测者:Observable,即可以被观察的东西,有时候会称之为主题,即Subject

情景:
天气预报订阅
如果天气发生变化,通知订阅者,订阅事物与订阅者可能是单对单也可能是一对多 多对多的关系。
创建天气model:

public class Weather {
    private String description;

    public String getDescription() {
        return description;
    }

    public Weather(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Weather{" +
                "description='" + description + '\'' + '}';
    }
}

创建被观测者,即observable:
其应该至少提供:订阅、退订、状态发生变化通知观测者的方法

public class Observable<T> {
    /**
     * 订阅者们
     */
    ArrayList<Observer<T>> observers = new ArrayList<>();
    /**
     * 订阅
     * @param observer
     */
    public void register(Observer<T> observer){
        if (observer==null) return;
        synchronized (this){
            if (observers.contains(observer))return;
            observers.add(observer);
        }
    }

    /**
     * 退订
     * @param observer
     */
    public void unregister(Observer<T> observer){
        observers.remove(observer);
    }

    /**
     * 通知各个订阅者
     */
    public void notifyObserver(T data){
        for (Observer<T> observer :observers){
            observer.onUpdate(data);
        }
    }
}

创建观测者接口,观测者只需接收状态变化:

public interface Observer<T> {

    void onUpdate(T data);
}

test:

public class Test {

    public static void main(String[] s){
        Observable<Weather> observable = new Observable<>();
        Observer<Weather> xiaoming = new Observer<Weather>() {
            @Override
            public void onUpdate(Weather data) {
                System.out.println("小明接收到的订阅:"+data.getDescription());
            }
        };
        Observer<Weather> xiaohong = new Observer<Weather>() {
            @Override
            public void onUpdate(Weather data) {
                System.out.println("小红接收到的订阅:"+data.getDescription());
            }
        };
        observable.register(xiaoming);
        observable.register(xiaohong);

        Weather weather = new Weather("多云");
        observable.notifyObserver(weather);
        weather = new Weather("阴天");
        observable.notifyObserver(weather);
        weather = new Weather("晴天");
        observable.notifyObserver(weather);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容