观察者模式

认识观察者模式

我们看看报纸和杂志的订阅是怎么回事:

1.报社的业务是出版报纸。

2.向某家报订阅报纸,只要他有新报纸出版,就会给你送来。只要你是他们的用户,你就会一直收到新报纸。

3.当你不想看报纸的时候,取消订阅,他们就不会再送新报纸来。

4.只要报社还在运营,就会一直人(或单位)向他们订阅报纸或取消订阅报纸。

出版者+订阅者=观察者模式

如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版者改称为“主题”(Subject),订阅者改称为“观察者”(Observer)。

让我们来看得更仔细一点:

定义观察者模式

当你试图勾勒观察者模式时,可以利用报纸订阅服务,以及出版者和订阅者比拟这一切。

在真实的世界中,你通常会看到观察者模式被定义成:

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

难察者模式定义了一系列对象之间的一对多关系。 当一个对象改变状态,其他依赖者都会收到通知。

主题和观察者定义了一对多的关系。观察者依赖子此主题,只要主题状态一有变化,观察者就会被通知。根据通知的风格,观察者可能因此新值而更新。

稍后你会右到,实现观察者模式的方法不只一种,但是以包含Subject与Observer接口的类设计的做法最常见。

实例:

气象监测应用的概况

此系统中的三个部分是气象站(获取实际气象数据的物理装置),WeatherDate对象(追踪来自气象站的数据,并更新布告栏)和布告栏

WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。WeatherData对象会随即更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。

如果我们选择接受这个项目,我们的工作就是建立一个应用,利用WeatherData对象取得数据,并更新三个布告板:目前状况.气象统计和天气预报。

布告栏(观察者),WeatherData对象(主题)

Observer.java

public interface Observer {

	public void update(float temp, float humidity,float pressure);
	
}
复制代码

subject.java

public interface subject {

	public void registerObserver(Observer o);
	public void removeObserver(Observer o);
	public void notifyObserver();

}
复制代码

DisplayElement.java

public interface DisplayElement {

	public void display();
}
复制代码

CurrentConditionDisplay.java

public class CurrentConditionDisplay implements Observer,DisplayElement{

	private float temp;
	private float humidity;
	private float pressure;
	private subject WeatherData;
	
	CurrentConditionDisplay(WeatherData a){
		this.WeatherData=a;
		a.registerObserver(this);
	}
	@Override
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("temp="+temp+"\nhumidity="+humidity+"\npressure="+pressure);
	}

	@Override
	public void update(float temp, float humidity, float pressure) {
		// TODO Auto-generated method stub
		this.pressure=pressure;
		this.humidity=humidity;
		this.temp=temp;
		display();
	}

}
复制代码

Observer.java

public interface Observer {

	public void update(float temp, float humidity,float pressure);
}
复制代码

Test.java

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		WeatherData w=new WeatherData();
		CurrentConditionDisplay a=new CurrentConditionDisplay(w);
		w.setMeasurements(80, 30, 4);
		w.setMeasurements(8, 3, 4);
	}
 
}
复制代码

最后

后续还会更新其它设计模式,有错欢迎提出,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值