java实现观察者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangquan2015/article/details/82813666

观察者模式(发布/订阅模式)提供了避免组件之间紧密耦合的另一种方法,它将观察者和被观察者的对象分离开。在该模式中,一个对象通过添加一个方法是的自身变得可观察。

例如,用户界面可以作为观察者,业务数据是被观察者,当数据有变化后会通知界面,界面收到通知后,会根据自己的显示方式修改界面。一个对象只做一件事情,并且将它做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

import java.util.ArrayList;
interface Subject{
	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObservers();
	
}
class Whether implements Subject{
	private ArrayList<Observer>observers=new ArrayList<Observer>();
	private float temperature;
	@Override
	public void notifyObservers() {
		for(int i=0;i<this.observers.size();i++) {
			this.observers.get(i).update(temperature);
		}
	}
	@Override
	public void registerObserver(Observer o) {
		this.observers.add(o);
	}
	@Override
	public void removeObserver(Observer o) {
		this.observers.remove(o);
	}
	public void whetherChange() {
		this.notifyObservers();
	}
	public float getTemperature(){
		return temperature;
	}
	public void setTemperature(float temperature) {
		this.temperature=temperature;
		notifyObservers();
	}
}
interface Observer{
	//更新温度
	public void update(float temp);
}
class WhetherDisplay1 implements Observer{
	private float temprature;
	public WhetherDisplay1(Subject whether) {
		whether.registerObserver(this);
	}
	@Override
	public void update(float temp) {
		this.temprature=temp;
		display();
	}
	public void display() {
		System.out.println("display1:"+this.temprature);
	}
}
class WhetherDisplay2 implements Observer{
	private float temprature;
	public WhetherDisplay2(Subject whether) {
		whether.registerObserver(this);
	}
	@Override
	public void update(float temp) {
		this.temprature=temp;
		display();
	}
	public void display() {
		System.out.println("display2:"+this.temprature);
	}
}
public class HelloWorld{
	public static void main(String[] args) {
		Whether whether=new Whether();
		WhetherDisplay1 d1=new WhetherDisplay1(whether);
		WhetherDisplay2 d2=new WhetherDisplay2(whether);
		whether.setTemperature(27);
		whether.setTemperature(26);
	}
}

运行结果:

display1:27.0
display2:27.0
display1:26.0
display2:26.0

猜你喜欢

转载自blog.csdn.net/zhangquan2015/article/details/82813666