• 【Java】Observer Pattern


    前言

      代码来源于生活,更加高于生活。设计模式让我们的生活更加的方便。观测一个东西,盯着一个东西,关注一个公众号,这些东西,如果没有即时通知的话,我们又特别想了解这方面的内容,那么我们除了一直耗着时间找人看着,可能没有更好的方法了,观察者模式的思想就是本人不用亲自盯着变化,当这些东西变化了,会通知本人了解情况。下面采用Observer Pattern进行实现。

    内容

    精华:

      定义了对象直接的一对多依赖,这样一来,当一个对象改变转变状态时,它的所有依赖者都会收到通知并自动更新。

    原则:

      为交互对象之间的松耦合设计而努力。松耦合设计更有弹性,更能应付变化。

    UML图部分:


    DEMO部分:


    说明:左半部分接口和一个类,分别定义了流程中用到的方法,注册、更新、通知、删除等,具体类做了具体的实现。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">/*
     * author:zhoulitong
     */
     interface Subject {
    	public void registerObserver(Observer o);//注册一个观察者
    	public void removeObserver(Observer o);//移除一个观察者
    	public void notifyObservers();//通知观察者
    }
    
    //weatherdata现在实现了subject接口
    class WeatherData implements Subject{
    	
    	private ArrayList observers;
    	private float temperature;
    	private float humidity;
    	private float pressure;
    	
    	public WeatherData(){
    		observers = new ArrayList();
    	}
    	
    	//注册观察者
    	public void registerObserver (Observer o){
    		observers.add(o);//此处定义observes为泛型类型,这种类型本身有增加删除方法;
    	}
    	
    	//删除观察者
    	public void removeObserver(Observer o){
    		int i = observers.indexOf(o);//定义i为观察者的下标号
    		//如果存在观察者,就执行删除的方法
    		if(i>=0){
    			observers.remove(i);
    		}
    	}
    	
    	//具体通知观察者内容
    	public void notifyObservers(){
    		//i为一群观察者的每一个观察者
    		for(int i = 0; i < observers.size();i++){
    			Observer observer = (Observer)observers.get(i);
    			observer.update(temperature, humidity,pressure);
    		}	
    	}
    	
    	//通知观察者
    	public void measurementsChanged(){
    		notifyObservers();
    	}
    	
    	//设定数据,并提示更新了数据
    	public void setMeasurements(float temperature, float humidity, float perssure){
    		this.temperature = temperature;
    		this.humidity = humidity;
    		this.pressure = perssure;
    		measurementsChanged();
    	}
    }</span>

    说明:右半部分功能为接受通知后要更新数据和显示数据。

    <span style="font-family:KaiTi_GB2312;font-size:18px;">interface Observer{
    	public void update(float temp, float humidity, float pressure);
    }
     interface DisplayElement{
    	 public void display();
     }
    
     //此布告板实现了Observer接口,所以可以从WeatherData对象中获得改变
     class CurrentConditionsDisplay implements Observer,DisplayElement{
    	 private float temperature;
    	 private float humidity;
    	 private Subject weatherData;
    	 
    	 public CurrentConditionsDisplay(Subject weatherData){
    		 this.weatherData = weatherData;
    		 weatherData.registerObserver(this);
    	 }
    	 
    	 public void update(float temperature, float humidity, float pressure){
    		 this.temperature = temperature;
    		 this.humidity = humidity;
    		 display();
    	 }
    	 
    	 public void display(){
    		 System.out.println("Current conditions: "+ temperature + "F degrees and " + humidity + "% humidity");
    	 }
     }</span>

    客户端:实例化一个weatherData对象和多个观察者对象,进行注册

    <span style="font-family:KaiTi_GB2312;font-size:18px;">public class WeatherStation{
    	public static void main(String[] args){
    		WeatherData weatherData = new WeatherData();
    		
    		CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
    		weatherData.setMeasurements(80, 65, 30.4f);
    	}
    }</span>

    小结

    在java中util里面有JDK自带的观察者Observer包,采用java自带的观察者也可以达到相同的功能,实现接口的时候,实现不同的更新方法就可以了。


    感谢您的宝贵时间···


  • 相关阅读:
    严蔚敏数据结构习题3.14
    Effective C++ Item 34 Differentiate between inheritance of interface and inheritance of implementation
    Effective C++ Item 33 Avoid hiding inherited names
    Effective C++ Item 19 Treat class design as type design
    Effective C++ Item 18 Make interfaces easy to use correctly and hard to use incorrectly
    Effective C++ Item 17 Store newed objects in smart pointer in standalone statements
    Effective C++ Item 16 Use the same form in corresponding uses of new and delete
    Effective C++ Item 15 Provide access to raw resources in resource-managing classes
    Effective C++ Item 14 Think carefully about copying behavior in resource-managing classe
    Effective C++ Item 13 Use object to manage resources
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412332.html
Copyright © 2020-2023  润新知