我对观察者模式的理解

一.概念

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

二.设计原则

4.为了交互对象之间的松耦合设计而努力。

三.举例子
现在要做一个天气温度显示,每当温度改变的时候,就把最新的温度发送到设备上显示出来。也就是说温度这个对象必须通知显示温度的设备,但他不知道有多少设备。然而也不能假定这些设备是哪些。。所以可以来使用观察者模式来设计。可以分析出 天气温度是被监听的对象,设备都是监听的对象。。。
import java.util.Observable;
//天气温度对象,继承Observable对象,
public class WeatherData extends Observable {
	private int tmp;//温度
	public void proceedChanged() {
		setChanged();
		notifyObservers(); //采用观察者自己“拉”的模式
	}
	public void changeTmp(int t) {
		this.tmp = t;
		proceedChanged();
	}
	public int getTmp() {
		return tmp;
	}
}
在设计监听者时,为了更好扩展,设置了个温度显示接口。
import java.util.Observer;

public interface Display extends Observer {
	public void display();
}

import java.util.Observable;
//PC端监听者
public class PCDisplay implements Display {

	private Observable observable;
	private WeatherData weatherData;
	
	public PCDisplay(Observable observable) {
		this.observable = observable;
		this.observable.addObserver(this);//增加PC端监听者
	}
	@Override
	public void display() {
		System.out.println("PC端监听到现在温度是"+weatherData.getTmp());
	}
	@Override
	public void update(Observable o, Object arg) {
		if(o instanceof WeatherData) {
			this.weatherData = (WeatherData) o;
			display();
		}
	}
}

import java.util.Observable;
//Phone端监听者
public class PhoneDisplay implements Display {
	
	private Observable observable;
	private WeatherData weatherData;
	
	public PhoneDisplay(Observable observable) {
		this.observable = observable;
		this.observable.addObserver(this);//增加Phone端监听者
	}
	@Override
	public void display() {
		System.out.println("Phone端监听到现在的温度是" + weatherData.getTmp());
	}
	@Override
	public void update(Observable o, Object arg) {
		if(o instanceof WeatherData) {
			this.weatherData = (WeatherData) o;
			display();
		}
	}
}
然后写个测试来运行一下吧。。。
public class Test {
	public static void main(String[] args) {
		WeatherData weather = new WeatherData();
		PhoneDisplay phoneDisplay = new PhoneDisplay(weather);//设置手机端监听天气
		PCDisplay pcDisplay = new PCDisplay(weather);//设置PC端监听天气
		weather.changeTmp(31);
		weather.changeTmp(28);
		weather.changeTmp(22);
	}
}
运行结果:


四.理解
当一个对象更新的时候,需要时时的告诉别的对象更新,或者要同时更新别的对象的时,且这两者的耦合性不能太高,那就用观察者模式。两个对象的交互性还是存在的,但是耦合性却已大大减小。



更多参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值