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);
    
        }
    
    }
  • 相关阅读:
    Secret-field团队 Alpha冲刺阶段博客记录
    alpha阶段测试报告
    第七周会议记录
    第六周会议记录
    《Secret—field团队》第一次作业:公课网课程评价系统
    linux下用hadoop streaming 跑php总是jobs fail!
    php请求nginx服务器返回403
    Linux达人养成计划I——文件搜索命令
    Linux达人养成计划I——链接命令
    Linux达人养成计划I——常见目录作用
  • 原文地址:https://www.cnblogs.com/moveofgod/p/12540665.html
Copyright © 2011-2022 走看看