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

    一、定义

      对象之间定义一对多的依赖,当一个对象状态改变,依赖它的对象都会收到通知并作出相应的更新。

    二、应用场景

      典型的就是杂志的订阅,rss订阅。我们订阅的一方就形成了对杂志社的依赖,只要杂志社有更新,而我们就对得到相应的通知

    三、涉及的概念

      主题Subject(杂志社)

      观察者Observer(我们订阅的一方)

    四、接口的定义

      对于杂志社(Subject)而言:

      1、可以添加一个订阅的人(Observer);registerObserver(Observer observer);

      2、如果不想订阅了,那杂志社可以吧相应订阅的人从名单上移除,那以后有新的杂志出来,不会再发送给那个人了;removeObserver(Observer observer)

      3、有新的杂志出来,那就要通知每个订阅的人;notifyObservers();

      对应的java类如下

    /**
     * @ClassName   类  名   称:    Subject.java
     * @Description 功能描述:    主题
     * @author      创  建   者:    zhengQun    
     * @date        创建日期:    2013-11-21下午2:16:09
     */
    public interface Subject {
        public void registerObserver(Observer observer);
        public void removeObserver(Observer observer);
        public void notifyObservers();
    }

      对于我们订阅的一方(观察者):对于杂志的到来,我们可能会进行阅读,也有可能做收藏用。。。总的来说就是我们如何来应对主题的更新。对应的java类如下:

    /**
     * @ClassName   类  名   称:    Observer.java
     * @Description 功能描述:    
     * @author      创  建   者:    zhengQun    
     * @date        创建日期:    2013-11-21下午2:27:30
     */
    public interface Observer {
        public void update(float temperature,float humidity,float pressure);
    }

    五、具体的应用:

    如果气象站温度、湿度、压力改变了,需要在对应的布告板上显示出来

    /**
     * @ClassName   类  名   称:    WeatherData.java
     * @Description 功能描述:    
     * @author      创  建   者:    zhengQun    
     * @date        创建日期:    2013-11-21下午2:29:12
     */
    public class WeatherData implements Subject{
        private List<Observer> observerList;
        private float temperature;
        private float humidity;
        private float pressure;
        
        public WeatherData() {
            observerList = new ArrayList<Observer>();
        }
    
        public WeatherData(List<Observer> observerList) {
            this.observerList = observerList;
        }
    
        public void registerObserver(Observer observer) {
            observerList.add(observer);
        }
    
        public void removeObserver(Observer observer) {
            if(observerList.indexOf(observer) != -1){
                observerList.remove(observer);
            }
        }
    
        public void notifyObservers() {
            for (Observer o : observerList) {
                o.update(temperature, humidity, pressure);
            }
        }
        
        public void mesurementsChanged(){
            notifyObservers();
        }
        
        public void setMesurements(float temperature,float humidity,float pressure){
            this.setTemperature(temperature);
            this.setHumidity(humidity);
            this.setPressure(pressure);
            mesurementsChanged();
        }
    
        public float getTemperature() {
            return temperature;
        }
    
        public void setTemperature(float temperature) {
            this.temperature = temperature;
        }
    
        public float getHumidity() {
            return humidity;
        }
    
        public void setHumidity(float humidity) {
            this.humidity = humidity;
        }
    
        public float getPressure() {
            return pressure;
        }
    
        public void setPressure(float pressure) {
            this.pressure = pressure;
        }
    }

    布告板:

    /**
     * @ClassName   类  名   称:    CurrentConditionDisplay.java
     * @Description 功能描述:    
     * @author      创  建   者:    zhengQun    
     * @date        创建日期:    2013-11-21下午2:51:46
     */
    public class CurrentConditionDisplay implements Observer,DisplayBehavior{
        private float temperature;
        private float humidity;
        
        private Subject weatherData;
        
        public CurrentConditionDisplay() {
        }
    
        public CurrentConditionDisplay(Subject weatherData) {
            this.weatherData = weatherData;
            weatherData.registerObserver(this);
        }
    
        public void display() {
            System.out.println("当前的状况:" + temperature + "℃," + humidity + "%湿度");
        }
    
        public void update(float temperature, float humidity, float pressure) {
            this.temperature = temperature;
            this.humidity = humidity;
            display();
        }
        
    }

    测试类:

    /**
     * @ClassName   类  名   称:    Test.java
     * @Description 功能描述:    
     * @author      创  建   者:    zhengQun    
     * @date        创建日期:    2013-11-21下午3:06:18
     */
    public class Test {
        public static void main(String[] args) {
            WeatherData weatherData = new WeatherData();
            CurrentConditionDisplay display = new CurrentConditionDisplay(weatherData);
    
            weatherData.setMesurements(12, 60, 14);
        }
    }

      

  • 相关阅读:
    avalon ms-repeat avalon1
    抓取各个浏览器引擎关键字,,百度学术关键字
    JS中Float类型加减乘除 修复
    js jquery 权限单选 bug修改以及正确代码 购物车数量加减
    图片加载错误默认显示图片
    文本框中焦点竖杆长度控制
    Go语言中 Print,Println 和 Printf 的区别(八)
    typescript中新增的基本数据类型
    尝试自己搭一个简单的typescript运行环境
    Go语言流程控制中的break,continue和goto(七)
  • 原文地址:https://www.cnblogs.com/zhengqun/p/3533721.html
Copyright © 2011-2022 走看看