zoukankan      html  css  js  c++  java
  • 05 观察者模式 Observer

    群体广播信息时, 就可以用到观察者模式

    生产者(WeatherData天气变化) -> 服务方法(WeatherData, 理解为气象站) -> 观察者(订阅者Observer)(用一个列表维护当前的观察者)

    天气预报举例: 气象站检测, 然后通过公告发布出去

    需要一个开放性的 API, 便于第三方获取

    测量数据实时更新,并通知第三方

    对象:

    生产者, 为了简化模式, 这里把生产者模拟放到了气象站里, 实际上正常来说, 应该还有个生产者列表, 生产出不同的topic, 订阅者订阅的也是不同的topic.

    气象站, WeatherData, 提供注册和取消关注的方法给到观察者, 并且提供 notify 给到所有的观察者最新的气象变化

    观察者, Observer, 接收最新的天气变化, 并显示.

    package com.leon.design;
    
    public interface Subject {
        void registerObserver(Observer o);
        void removeObserver(Observer o);
        void notifyObservers();
    }
    
    package com.leon.design;
    
    public interface Observer {
        void update(int temp);
        void display();
    }
    
    package com.leon.design;
    
    import java.util.ArrayList;
    
    public class WeatherData implements Subject {
        private int temperature;
        ArrayList<Observer> observer;
        public WeatherData() {
            observer = new ArrayList<Observer>();
        }
        
        public void setTemperature(int temperature) {
            this.temperature = temperature;
            doChange();
        }
        
        public void doChange() {
            notifyObservers();
        }
    
        @Override
        public void registerObserver(Observer o) {
            observer.add(o);
            
        }
    
        @Override
        public void removeObserver(Observer o) {
            if (observer.contains(o)) {
                observer.remove(o);
            }    
        }
    
        @Override
        public void notifyObservers() {
            for (int i = 0; i < observer.size(); i++) {
                observer.get(i).update(this.temperature);
            }
            
        }
    }
    
    package com.leon.design;
    
    public class Sina implements Observer {
        private int temp;
        @Override
        public void update(int temp) {
            this.temp = temp;
            display();
            
        }
    
        @Override
        public void display() {
            System.out.println("Sina boradcast: the temperature is" + this.temp + ".");    
        }
        
    }
    
    package com.leon.design;
    
    public class Baidu implements Observer {
        private int temp;
        @Override
        public void update(int temp) {
            this.temp = temp;
            display();
            
        }
    
        @Override
        public void display() {
            System.out.println("Baidu boradcast: the temperature is" + this.temp + ".");    
        }
        
    }
    
    package com.leon.design;
    
    public class ObserverClient {
    
        public static void main(String[] args) {
            WeatherData weather = new WeatherData();
            
            Observer sina = new Sina();
            Observer baidu = new Baidu();
            // 注册
            weather.registerObserver(sina);
            weather.registerObserver(baidu);
            
            weather.setTemperature(100);
    
        }
    
    }
  • 相关阅读:
    37. Sudoku Solver(js)
    36. Valid Sudoku(js)
    35. Search Insert Position(js)
    34. Find First and Last Position of Element in Sorted Array(js)
    33. Search in Rotated Sorted Array(js)
    32. Longest Valid Parentheses(js)
    函数的柯里化
    俞敏洪:我和马云就差了8个字
    vue路由传值params和query的区别
    简述vuex的数据传递流程
  • 原文地址:https://www.cnblogs.com/moveofgod/p/12540665.html
Copyright © 2011-2022 走看看