• 设计模式--观察者模式


    Internet气象站项目:

      提供温度、气压和湿度的接口

      测量数据更新时需时时通知给第三方 需要设计开放型API,便于其他第三方公司也能接入气象站获取数据

    WeatherData类

      

    一个通常的设计方案

      

    代码演示:

    WeatherData类

    package com.java.hexter.internetweather;
    
    public class WeatherData {
        
        private float mTemperatrue;
        private float mPressure;
        private float mHumidity;
        private CurrentConditions mCurrentConditions;
        public WeatherData(CurrentConditions mCurrentConditions)
        {
          this. mCurrentConditions= mCurrentConditions;
        }
        
        public float getTemperature()
        {
            return mTemperatrue;   
        }
        
        public float getPressure()
        {
            return mPressure;    
        }
        
        public float getHumidity()
        {
            return mHumidity;  
        }
        public void dataChange()
        {
            mCurrentConditions.update(getTemperature(), getPressure(), getHumidity());
        }
        
        public void setData(float mTemperature,float mPressure,float mHumidity)
        {
            this.mTemperatrue=mTemperature;
            this.mPressure=mPressure;
            this.mHumidity=mHumidity;
            dataChange();
        }
        
    }

     代表第三方的类

    package com.java.hexter.internetweather;
    
    public class CurrentConditions {
        
        private float mTemperature;
        private float mPressure;
        private float mHumidity;
        
        public void update(float mTemperature,float mPressure,float mHumidity)
        {
            this.mTemperature=mTemperature;
            this.mPressure=mPressure;
            this.mHumidity=mHumidity;
            display();
        }
        
        public void display()
        {
            System.out.println("***Today mTemperature: "+mTemperature+"***");
            System.out.println("***Today mPressure: "+mPressure+"***");
            System.out.println("***Today mHumidity: "+mHumidity+"***");
        }
    }

    有些问题

      1)其他第三方公司接入气象站获取数据的问题

      2)无法在运行时动态的添加第三方

    观察者模式原理

    观察者模式就像定牛奶业务

      1)奶站,Subject

      2)用户,Observer

    Subject:登记注册、移除和通知

      

    Observer:接收输入

      

    观察者模式: 对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化

    用观察者模式设计重新设计的方案

      

    代码演示: 

    package com.java.hexter.internetweather.observer;
    
    public interface Subject {
        public void registerObserver(Observer o);
        public void removeObserver(Observer o);
        public void notifyObservers();
    }
    package com.java.hexter.internetweather.observer;
    
    public interface Observer {
        public void update(float mTemperatrue,float mPressure,float mHumidity);
    }
    package com.java.hexter.internetweather.mode;
    
    import java.util.ArrayList;
    
    import com.java.hexter.internetweather.observer.Observer;
    import com.java.hexter.internetweather.observer.Subject;
    
    public class WeatherDataSt implements Subject{
        
        private float mTemperatrue;
        private float mPressure;
        private float mHumidity;
        private ArrayList<Observer> mObservers;
        public WeatherDataSt()
        {
            mObservers=new ArrayList<Observer>();
        }
        
        public float getTemperature()
        {
            return mTemperatrue;
            
        }
        public float getPressure()
        {
            return mPressure;    
        }
        
        public float getHumidity()
        {
            return mHumidity;    
        }
        public void dataChange()
        {
            notifyObservers();
        }
        
        public void setData(float mTemperatrue,float mPressure,float mHumidity)
        {
            this.mTemperatrue=mTemperatrue;
            this.mPressure=mPressure;
            this.mHumidity=mHumidity;
            dataChange();
        }
    
        @Override
        public void registerObserver(Observer o) {
            // TODO Auto-generated method stub
            mObservers.add(o);
        }
    
        @Override
        public void removeObserver(Observer o) {
            // TODO Auto-generated method stub
            if(mObservers.contains(o))
            {mObservers.remove(o);}
        }
    
        @Override
        public void notifyObservers() {
            // TODO Auto-generated method stub
            for(int i=0,len=mObservers.size();i<len;i++)
            {
                mObservers.get(i).update(getTemperature(), getPressure(), getHumidity());
            }
        }
    
    }
    package com.java.hexter.internetweather.mode;
    
    import com.java.hexter.internetweather.observer.Observer;
    
    public class CurrentConditions implements Observer {//可以有多个子类代表多个第三方
    
        private float mTemperatrue;
        private float mPressure;
        private float mHumidity;
    
        @Override
        public void update(float mTemperatrue, float mPressure, float mHumidity) {
            // TODO Auto-generated method stub
            this.mHumidity = mHumidity;
            this.mPressure = mPressure;
            this.mTemperatrue = mTemperatrue;
            display();
        }
    
        public void display() {
            System.out.println("***Today mTemperatrue:" + mTemperatrue + "***");
            System.out.println("***Today mPressure:" + mPressure + "***");
            System.out.println("***Today mHumidity:" + mHumidity + "***");
        }
    
    }

    Java内置的观察者 Observable Observer

    用Java内置观察者重新设计该项目

    内置观察者的注意点   Observable是类而不是接口

    代码如下:

    package com.java.hexter.internetweather.jv;
    
    import java.util.Observable;
    
    public class WeatherData extends Observable{
        private float mTemperatrue;
        private float mPressure;
        private float mHumidity;
        
        public float getTemperature()
        {
            return mTemperatrue;
        }
        
        public float getPressure()
        {
            return mPressure;  
        }
        
        public float getHumidity()
        {
            return mHumidity;    
        }
        
        
        public void dataChange()
        {
            this.setChanged();
            this.notifyObservers(new Data(getTemperature(),getPressure(),getHumidity()));
            
        }
        
        
        public void setData(float mTemperatrue,float mPressure,float mHumidity)
        {
            this.mTemperatrue=mTemperatrue;
            this.mPressure=mPressure;
            this.mHumidity=mHumidity;
            dataChange();
        }
        
        public class Data
        {
            public float mTemperatrue;
            public float mPressure;
            public float mHumidity;
            public Data(float mTemperatrue,float mPressure,float mHumidity)
            {
                this.mTemperatrue=mTemperatrue;
                this.mPressure=mPressure;
                this.mHumidity=mHumidity;
            }
        }
        
    }
    package com.java.hexter.internetweather.jv;
    
    import java.util.Observable;
    import java.util.Observer;
    
    import com.java.hexter.internetweather.jv.WeatherData.Data;
    
    
    public class CurrentConditions implements Observer {
        
        private float mTemperatrue;
        private float mPressure;
        private float mHumidity;
        @Override
        public void update(Observable arg0, Object arg1) {
            // TODO Auto-generated method stub
            this.mTemperatrue=((Data)(arg1)).mTemperatrue;
            this.mPressure=((Data)(arg1)).mPressure;
            this.mHumidity=((Data)(arg1)).mHumidity;
            display();
        }
        
        public void display()
        {
            System.out.println("***Today mTemperatrue:" +mTemperatrue+"***");
            System.out.println("***Today mPressure:" +mPressure+"***");
            System.out.println("***Today mHumidity:" +mHumidity+"***");
        }
        
        
    }
  • 相关阅读:
    一脚踩进java之基础篇07——数组
    一脚踩进java之基础篇06——流程控制语句(if...else,while,for,switch...case)
    一脚踩进java之基础篇05——运算符
    一脚踩进java之基础篇04——变量
    [转]进程间通信
    [转]netstat 命令详解
    僵尸进程
    如何进行表的复制
    解决system调用返回ECHILD的问题
    Oracle保留2位小数
  • 原文地址:https://www.cnblogs.com/lm970585581/p/9591777.html
Copyright © 2020-2023  润新知