zoukankan      html  css  js  c++  java
  • Java设计模式(二) 观察者模式

    观察者模式: 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会受到通知并自动更新。

    1,定义事件源接口

    package com.pattern.observer;
    
    public interface Subject {
    	
    	public void registerObserver(Observer o);
    	
    	public void removeObserver(Observer o);
    	
    	public void notifyObserver();
    }
    

    2,定义事件源

    package com.pattern.observer;
    
    import java.util.ArrayList;
    
    /**
     * 事件源
     */
    public class WeatherData implements Subject {
    
    	private ArrayList observers;
    	private float temperature;
    	private float humidity;
    	private float pressure;
    
    	public WeatherData() {
    		observers = new ArrayList();
    	}
    
    	/**
    	 * @see com.pattern.observer.Subject#registerObserver(com.pattern.observer.Observer)
    	 */
    	@Override
    	public void registerObserver(Observer o) {
    		observers.add(o);
    	}
    
    	/**
    	 * @see com.pattern.observer.Subject#removeObserver(com.pattern.observer.Observer)
    	 */
    	@Override
    	public void removeObserver(Observer o) {
    		int i = observers.indexOf(o);
    		if (i >= 0) {
    			observers.remove(i);
    		}
    	}
    
    	/**
    	 * @see com.pattern.observer.Subject#notifyObserver()
    	 */
    	@Override
    	public void notifyObserver() {
    		for(int i=0;i<observers.size();i++){
    			Observer observer = (Observer)observers.get(i);
    			observer.update(temperature, humidity, pressure);
    		}
    	}
    	
    	public void measurementsChanged(){
    		notifyObserver();
    	}
    	
    	public void setMeasurements(float temperature,float humidity,float pressure){
    		this.temperature  = temperature;
    		this.humidity = humidity;
    		this.pressure = pressure;
    		measurementsChanged();
    	}
    
    }
    
    

    3,定义观察者接口

    package com.pattern.observer;
    
    public interface Observer {
    	
    	public void update(float temp,float humidity,float pressure);
    	
    }
    


    4,定义显示接口

    package com.pattern.observer;
    
    public interface DisplayElement {
    	
    	public void display();
    	
    }
    


    5,观察者实现类

    package com.pattern.observer;
    
    public class CurrentConditionsDisplay implements Observer,DisplayElement{
    
    	private float temperature;
    	private float humidity;
    	private Subject weatherData;
    	
    	public CurrentConditionsDisplay(Subject weatherData){
    		this.weatherData = weatherData;
    		weatherData.registerObserver(this);
    	}
    	
    	/** 
    	 * @see com.pattern.observer.DisplayElement#display()
    	 */
    	@Override
    	public void display() {
    		System.out.println("Current conditions: "+temperature +"F degrees and "+humidity+"% humidity");
    	}
    
    	/** 
    	 * @see com.pattern.observer.Observer#update(float, float, float)
    	 */
    	@Override
    	public void update(float temperature, float humidity, float pressure) {
    		this.temperature = temperature;
    		this.humidity = humidity;
    		display();
    	}
    
    }
    

    6,测试

    package com.pattern.observer;
    
    
    public class WeatherStation {
    	
    	public static void main(String[] args){
    		WeatherData weatherData = new WeatherData();
    		
    		CurrentConditionsDisplay currentDisplay =  new CurrentConditionsDisplay(weatherData);
    		
    		weatherData.setMeasurements(80, 65, 30.4f);
    	}
    }
    


    类图如下所示:



     

  • 相关阅读:
    【C++】类的特殊成员变量+初始化列表
    SM Java实现
    Android使用OKHttp3实现下载(断点续传、显示运行进度)
    codeforces 486C Palindrome Transformation 贪心求构造回文
    手把手教你画AndroidK线分时图及指标
    怎样使用 iOS 7 的 AVSpeechSynthesizer 制作有声书(3)
    C# 读取Excel中的数据
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty
    java debug
    8种移动APP导航设计模式对照
  • 原文地址:https://www.cnblogs.com/mengjianzhou/p/5986821.html
Copyright © 2011-2022 走看看