• 设计模式:观察者模式


      观察者模式:在对象之间定义一对多的依赖,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

      在定义一对多的时候,我们把一称做主题,多称做观察者。下面我们直接看代码来简单了解观察者模式。

      第一步:先创建一个主题接口,对象使用此接口来新增、删除、通知观察者。

    //主题接口,用于添加、删除和通知观察者
    public interface Subject {
        //添加观察者
        public void registerObserver(Observer o);
        //删除观察者
        public void removeObserver(Observer o);
        //通知所有观察者
        public void notifyObservers();
    }

      第二步:创建一实现主题接口的实体类。其中temperature、humidity、pressure为主题通知给观察者的数据。

    //实现主题接口
    public class WeatherData implements Subject{
        private ArrayList observers;
        private float temperature;
        private float humidity;
        private float pressure;
        
        public WeatherData(){
            observers = new ArrayList();
        }
    
        @Override
        public void registerObserver(Observer o) {
            observers.add(o);
        }
    
        @Override
        public void removeObserver(Observer o) {
            int i = observers.indexOf(o);
            if(i >= 0){
                observers.remove(i);
            }
        }
    
        @Override
        public void notifyObservers() {
            for(int i =0; i<observers.size(); i++){
                Observer o = (Observer)observers.get(i);
                o.update(temperature, humidity, pressure);
            }
        }
        
        public void  measurementsChange(){
            notifyObservers();
        }
        
        public void setMeasurements(float temperature, float humidity,float pressure){
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            measurementsChange();
        }
    }

      第三步:创建一个观察者接口,并有一个update方法告诉观察者,当主题改变时调用。

    //观察者的需实现的接口,表明是观察者身份
    public interface Observer {
        public void update(float temperature, float humidity,float pressure);
    }

      第四步:创建两个观察者,并实现观察者接口。

    //创建一个观察者CurrentConditionsDisplay
    public class CurrentConditionsDisplay implements Observer{
    
        private float temperature;
        private float humidity;
        private float pressure;
        private Subject weatherData;
        
        public CurrentConditionsDisplay(Subject weatherData){
            this.weatherData = weatherData;
            //在主题中加入此观察者
            weatherData.registerObserver(this);
        }
        
        @Override
        public void update(float temperature, float humidity, float pressure) {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            System.out.println("观察者CurrentConditionsDisplay得到了数据:" + temperature +"," + humidity +"," + pressure);
        }
    }
    //创建另一个观察者StatisticsDisplay
    public class StatisticsDisplay implements Observer{
        private float temperature;
        private float humidity;
        private float pressure;
        private Subject weatherData;
        
        public StatisticsDisplay(Subject weatherData){
            this.weatherData = weatherData;
            //在主题中加入此观察者
            weatherData.registerObserver(this);
        }
        
        @Override
        public void update(float temperature, float humidity, float pressure) {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            System.out.println("观察者StatisticsDisplay得到了数据:" + temperature +"," + humidity +"," + pressure);
        }
    }

      第五步:测试

    public class Test {
        public static void main(String[] args) {
            WeatherData  weatherData = new WeatherData();
            CurrentConditionsDisplay conditionsDisplay = new CurrentConditionsDisplay(weatherData);
            StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
            weatherData.setMeasurements(1.0f,2.0f,3.0f);
        }
    }

      运行结果:

         

      好了,这就是一个简单的观察者模式了,其实在Java中,有内置的观察者模式,主要利用java.util.Observer和java.util.Observable,具体这里不讲解了,都很类似。

      

      下一节:装饰者模式

    作者:哀&RT
    出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    7.25
    7.24
    7.23
    7.22
    输入语句/条件运算符
    flowLayoutPanel1设置内容随着鼠标滚动而滚动
    dataGridView读取xml文件
    读文本内容 写入文本内容 创建复制文本
    cmd.ExecuteScalar 和配置连接设置
    $.ajax async同步加载
  • 原文地址:https://www.cnblogs.com/Tony-Anne/p/6498091.html
Copyright © 2020-2023  润新知