• 观察者模式(转)


    原文链接: http://blog.csdn.net/yongh701/article/details/49613587

    看类图知道ConcreteSubject与ConcreteObserver分别实现Subject与Observer两个接口,因为其继承线段是虚线
    同时观察者与主题之间是关联关系,也就是说观察者类中必有主题这个类成员,主题类中必有观察者这个类成员

    相关题目:
    某实验室欲建立一个实验室的环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据,当获取到最新的环境测量数据时,显示的环境数据能够更新,现在采用观察者(Observer)模式来开发该系统
    具体代码:
    package kunpu.plandesign.observe;
    
    /**
     * @author zhen
     */
    public interface Subject {
        /**
         * 注册观察者
         * @param observer
         */
        public void registerObserve(Observer observer);
    
        /**
         * 删除观察者
         * @param observer
         */
        public void removeObserve(Observer observer);
    
        /**
         * 通知观察者
         */
        public void notifyObserves();
    }
    
    
    package kunpu.plandesign.observe;
    
    /**
     * @author zhen
     */
    public interface Observer {
    
        /**
         * 观察操作
         * @param temp 温度
         * @param humidity 湿度
         * @param cleanness 清洁度
         */
        public void update(float temp, float humidity, float cleanness);
    
    }
    
    
    package kunpu.plandesign.observe;
    
    import java.util.ArrayList;
    
    /**
     * @author zhen
     * 环境数据
     */
    public class EnvironmentData implements Subject{
        private ArrayList<Observer> observers;
        private float temp;
        private float humidity;
        private float cleanness;
    
        public EnvironmentData() {
            observers = new ArrayList<>();
        }
    
        /**
         * 设置测量值
         * @param temp
         * @param humidity
         * @param cleanness
         */
        public void setMeasurements(float temp, float humidity, float cleanness){
            this.temp = temp;
            this.humidity = humidity;
            this.cleanness = cleanness;
            notifyObserves();
        }
    
    
        @Override
        public void registerObserve(Observer observer) {
            observers.add(observer);
        }
    
        @Override
        public void removeObserve(Observer observer) {
            observers.remove(observer);
        }
    
        @Override
        public void notifyObserves() {
            observers.forEach(observer -> {
                observer.update(getTemp(), getHumidity(), getCleanness());
            });
        }
    
        public ArrayList<Observer> getObservers() {
            return observers;
        }
    
        public void setObservers(ArrayList<Observer> observers) {
            this.observers = observers;
        }
    
        public float getTemp() {
            return temp;
        }
    
        public void setTemp(float temp) {
            this.temp = temp;
        }
    
        public float getHumidity() {
            return humidity;
        }
    
        public void setHumidity(float humidity) {
            this.humidity = humidity;
        }
    
        public float getCleanness() {
            return cleanness;
        }
    
        public void setCleanness(float cleanness) {
            this.cleanness = cleanness;
        }
    }
    
    
    package kunpu.plandesign.observe;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * @author zhen
     */
    public class CurrentConditionDisplay implements Observer {
        private String name;
        private Subject envData;
        private float temp;
        private float humidity;
        private float cleanness;
    
        @Override
        public void update(float temp, float humidity, float cleanness) {
            this.temp = temp;
            this.humidity = humidity;
            this.cleanness = cleanness;
        }
    
        public void display(){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date = sdf.format(new Date());
            System.out.println("我是" + name + ",时间:" + date + ",温度:" + temp + "、湿度:" + humidity + "、清洁度:" + cleanness + "" );
        }
    
        public CurrentConditionDisplay(String name, Subject envData) {
            this.name = name;
            this.envData = envData;
            envData.registerObserve(this);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Subject getEnvData() {
            return envData;
        }
    
        public void setEnvData(Subject envData) {
            this.envData = envData;
        }
    
        public float getTemp() {
            return temp;
        }
    
        public void setTemp(float temp) {
            this.temp = temp;
        }
    
        public float getHumidity() {
            return humidity;
        }
    
        public void setHumidity(float humidity) {
            this.humidity = humidity;
        }
    
        public float getCleanness() {
            return cleanness;
        }
    
        public void setCleanness(float cleanness) {
            this.cleanness = cleanness;
        }
    }
    
    package kunpu.plandesign.observe;
    
    /**
     * @author zhen
     * 环境监控
     */
    public class EnvironmentMonitor {
    
        public static void main(String[] args) {
            EnvironmentData environmentData = new EnvironmentData();
            CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay("观察者1", environmentData);
            CurrentConditionDisplay currentConditionDisplay1 = new CurrentConditionDisplay("观察者2", environmentData);
            environmentData.setMeasurements(12, 34, 52.3f);
            currentConditionDisplay.display();
            currentConditionDisplay1.display();
    
        }
    
    }
  • 相关阅读:
    向对象数组中添加新的属性 Jim
    vuecli3.0 postcsspxtoviewport将px转化为vwvh适配/Web 端屏幕适配方案 Jim
    js深拷贝与浅拷贝 Jim
    行业死亡案例汇总(客观记录不做评价)
    wins和linux 系统不同编码格式导致的.py执行问题: bad interpreter: No such or file directory
    Pyhon之类学习1
    How to handle error In $.get()
    sql 修改列名及表名
    程序设计类网站
    数据类型
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/8527241.html
Copyright © 2020-2023  润新知