zoukankan      html  css  js  c++  java
  • 观察者模式(转)

    原文链接: 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();
    
        }
    
    }
  • 相关阅读:
    andriod的数据传递方法
    Activity生命周期详解
    android 和主线程有关的小问题
    java解析Excel(xls、xlsx两种格式)
    菜鸟感想一
    springboot 填坑一 springboot java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)
    git 第一次提交至仓库
    andriod studio报错 Emulator: emulator: ERROR: x86 emulation currently requires hardware acceleration! Emulator: Process finished with exit code 1
    通过以太坊发行代币(token)
    nginx+tomcat 配置负载均衡集群 (转载)
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/8527241.html
Copyright © 2011-2022 走看看