【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自带的观察者也可以达到相同的功能,实现接口的时候,实现不同的更新方法就可以了。


感谢您的宝贵时间···


原文地址:https://www.cnblogs.com/zhoulitong/p/6412332.html