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


          一、定义

                  一种一对多的依赖关系,让多个观察者对想同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察这对象,是它们能够自动更新自己。

         二、例子。

                气象台对天气实时监控,只要天气的温度湿度等等一有变化就公告栏就更新数据。

               UML图:

                 

               代码:

                天气变化接口:          

    public interface Subject(){
    	public void registerObserver(Observer o);//添加公告栏
    	public void removeObserver(Observer o);//取消公告栏
    	public void notifyObservers();//通知公告栏更新
    }

                天气变化数据改变实现:

    public class WeatherData implements Subject{
    	private ArrayList observers;
    	private float temperature;
    	private float humidity;
    	private float pressure;
    	//公告栏的模版
    	public WeatherData(){
    		observers= new ArrayList();
    		
    	}
          	//添加公告栏
    	public void registerOvserver(Observer o ){
    		observers.add(o);
    	}
    	//移除公告栏
    	public void removeObserver(Observer o){
    		int i=observers.indexOf(o);
    		if(i>=0){
    			observers.remove(i);
    		}
    		
    	}
    	//通知公告栏更新的信息
    	public notifyObservers(){
    		for(int i=0;i<observers.size();i++){
    			Observer observer=(Observer)observer.get(i);
    			observer.update(temperature,humidity,pressure);
    		}
    	}
            //公告栏更新	
    	public void measurementsChanged(){
    		notifyObservers();
    	}
    	
    	//获得信息
    	public void setMeasurements(float temperature,float humidity,float pressure){
    	this.temperature=temperature;
    	this.humidity=humidity;
    	this.pressure=pressure;
    	measurementsChanged();
    	}
    }

            公告栏更新接口:

            

    public interface Observer(){
    	public void update(float temp,float humidity,float pressure);
    }

    公告栏显示接口:

    public interface DisplayElement(){
    	public void display();
    }
    


    公告栏:

    public class CurrentConditionsDisplay implements Observer,DisplayElements{
    	private float temperature;
    	private float humidity;
    	private Subject weatherData;
    	//公告栏构造函数
    	public CurrentConditionsDisplay(Subject weatherData){
    		this.weatherData=weatherData;
    		weatherData.registerOvserver(this);
    	}
    	//公告栏更新数据
    	public void update(float temperature,float humidity,float,float pressure){
    		this.temperature=temperature;
    		this.humidity=humidity;
    		display();
    	}
    	
    	public void display(){
    		System.out.println("Current conditions:"+ temperature+"F degress and "+humidity+"% humidity");
    	}
    }

    客户端:

           

    public class WeatherStation{
    	public static void main(String[] args){
    		WeatherData wetherData=new WeaterData();
    		CurrentConditionsDisplay currentDisplay(weaterData);
    		weaterData.setMeasurements(80,65,30.4f);
    	}
    }





     综述:

           观察者模式让双方都依赖于接口(或抽象),而不是依赖与具体,从而是的各自的变化都不会影响另一边的变化。公告板样式,显示数据的变化不会影响天气数据的变化。

          

  • 相关阅读:
    页面抛出的"Unable to validate data"错误
    oracle的sqlnet.ora,tnsnames.ora,listener.ora三个配置文件 water
    Win7下完全卸载Oracle 11g water
    抛出多个异常 water
    【转】有关Oracle随机字符串的生成方法及具体应用 water
    【转】oracle 中随机取一条记录的两种方法 water
    【转】Oracle索引列NULL值引发执行计划该表的测试示例 water
    Oracle 取随机数 water
    dbms_output.put_line长度限制问题 water
    oracle 监听启动、停止、查看命令 water
  • 原文地址:https://www.cnblogs.com/iplus/p/4490433.html
Copyright © 2020-2023  润新知