尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]相关的知识,希望对你有一定的参考价值。
尚硅谷传送门==>B站尚硅谷Java设计模式
❤❤❤感谢尚硅谷❤❤❤
最近开始计划学习一下设计模式了,加油!!!
情景引入
天气预报项目需求:
- 1 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(发布到自己的网站或第三方)
- 2 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
- 3 提供温度、气压和湿度的接口
- 4 测量数据更新时,要能实时的通知给第三方
先试试用传统方案解决问题,
在得到数据后就更新到气象站
CurrentConditions
的数据;然后 “显示”.
模拟气象站CurrentConditions
//当前状况,可理解为模拟气象站;
public class CurrentConditions {
//温度;
private float temperature;
//湿度;
private float humidity;
//气压;
private float pressure;
//更新气象数据;
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
//显示气象数据;
public void display() {
System.out.println("今天的温度==>" + temperature);
System.out.println("今天的湿度==>" + humidity);
System.out.println("今天的气压指数==> " + pressure);
}
}
气象数据WeatherData
//气象数据;
public class WeatherData {
//温度;
private float temperatrue;
//湿度;
private float humidity;
//气压;
private float pressure;
//气象站;
private CurrentConditions currentConditions;
//初始化信息;
public WeatherData(CurrentConditions currentConditions) {
this.currentConditions = currentConditions;
}
//获取温度;
public float getTemperature() {
return temperatrue;
}
//获取湿度;
public float getHumidity() {
return humidity;
}
//获取气压;
public float getPressure() {
return pressure;
}
//数据更新;
public void dataChange() {
currentConditions.update(getTemperature(), getPressure(), getHumidity());
}
//设置传入数据;
public void setData(float temperature, float pressure, float humidity) {
this.temperatrue = temperature;
this.pressure = pressure;
this.humidity = humidity;
//更新气象数据;
dataChange();
}
}
模拟客户端调用
public class Client {
public static void main(String[] args) {
//创建当前数据的对象;
CurrentConditions currentConditions = new CurrentConditions();
WeatherData weatherData = new WeatherData(currentConditions);
weatherData.setData(25, 80, 30);
}
}
得出
今天的温度==>25.0
今天的湿度==>30.0
今天的气压指数==> 80.0
需要注意的是;要是使用这样的方式;若增加一个显示气象的平台,就要在气象数据类WeatherData
中增加属性,以及方法.
观察者模式
对象之间多对一依赖
;被依赖的对象为(具体实行的方法),依赖的对象为用户(不同的),
以集合的方式来管理用户(Observer)
观察者接口Observer
//观察者;接口-->管理不同的用户;
public interface Observer {
//更新天气数据;(温度,气压,湿度)
public void update(float temperature, float humidity,float pressure);
}
不同的观察者;
气象平台ACurrentConditionA
//气象平台A
public class CurrentConditionA implements Observer{
//温度;
private float temperature;
//湿度;
private float humidity;
//气压;
private float pressure;
//更新气象数据;
@Override
public void update(float temperature,float humidity,float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
//显示气象数据;
public void display() {
System.out.println("------气象台A报道------");
System.out.println("今天的温度==>" + temperature);
System.out.println("今天的湿度==>" + humidity);
System.out.println("今天的气压指数==> " + pressure);
}
}
气象平台BCurrentConditionB
//气象平台B
public class CurrentConditionB implements Observer{
//温度;
private float temperature;
//湿度;
private float humidity;
//气压;
private float pressure;
//更新气象数据;
@Override
public void update(float temperature, float humidity,float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
//显示气象数据;
public void display() {
System.out.println("------气象台B报道------");
System.out.println("今天的温度==>" + temperature);
System.out.println("今天的湿度==>" + humidity);
System.out.println("今天的气压指数==> " + pressure);
}
}
定义平台的管理方法接口Subject
public interface Subject {
//注册,增加;
public void registerObserver(Observer observer);
//移出;
public void remove(Observer observer);
//通知所有的注册的用户
public void notifyObserver ( );
}
气象数据(核心类)WeatherData
public class WeatherData implements Subject {
//温度;
private float temperatrue;
//湿度;
private float humidity;
//气压;
private float pressure;
//观察者(用户集合)
private ArrayList<Observer> observerArrayList;
//初始化信息;
public WeatherData() {
observerArrayList = new ArrayList<Observer>();
}
//获取温度;
public float getTemperature() {
return temperatrue;
}
//获取湿度;
public float getHumidity() {
return humidity;
}
//获取气压;
public float getPressure() {
return pressure;
}
//数据更新;
public void dataChange() {
notifyObserver();
}
//设置传入数据;
public void setData(float temperature, float humidity, float pressure) {
this.temperatrue = temperature;
this.humidity = humidity;
this.pressure = pressure;
dataChange();
}
//注册;添加不同的气象台;
@Override
public void registerObserver(Observer observer) {
observerArrayList.add(observer);
}
//移除气象台;
@Override
public void remove(Observer observer) {
//若存在就移除;
if(observerArrayList.contains(observer)){
observerArrayList.remove(observer);
}
}
//通知所有的气象台;
@Override
public void notifyObserver() {
for (int i = 0; i < observerArrayList.size(); i++) {
observerArrayList.get(i).update(getTemperature(),getHumidity(),getPressure());
}
}
}
模拟客户端Client
//模拟客户端;
public class Client {
public static void main(String[] args) {
//创建气象数据对象;
WeatherData weatherData = new WeatherData();
//创建平台A对象;
//创建平台B对象;
Observer currentConditionA = new CurrentConditionA();
Observer currentConditionB = new CurrentConditionB();
//添加发布的平台;
weatherData.registerObserver(currentConditionA);
weatherData.registerObserver(currentConditionB);
//设置气象数据;
weatherData.setData(31f,60f,180f);
}
}
输出
------气象台A报道------
今天的温度==>31.0
今天的湿度==>60.0
今天的气压指数==> 180.0
------气象台B报道------
今天的温度==>31.0
今天的湿度==>60.0
今天的气压指数==> 180.0
使用这样的方式;让气象平台从原来的高耦合中隔离出来;若要添加新的平台,将创建的类对象添加即可;
而不是像之前那样直接在气象数据类WeatherData中去添加或更改.
在Jdk中用到的观察者模式
比如说;Observable
类;它用来管理 观察者Observer
“观察者”Observer
以上是关于尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]的主要内容,如果未能解决你的问题,请参考以下文章
尚硅谷设计模式学习(23)---[策略模式(strategy pattern)]