Java大数据平台开发 学习笔记(48)—— java设计模式(观察者模式)知识汇总

it2025-04-06  19

一、前言:

观察者模式还有一个名字叫发布-订阅模式,我们熟悉的消息队列如ActiveMQ,就是采用的这种设计模式,总的来说观察者模式主要难理解的地方有两个,一个是发布者对一个或多个观察者的管理,另一个就是实现消息发布者和订阅者之间的解耦。

二、观察者模式:

2.1、UML 图:

2.2、代码实例:

Step 1) 创建 Obser 接口:

public interface Obser { public void updata(float temperature, float pressure, float humidity); }

Step 2) 创建 CurrentConditions 实现类:

public class CurrentConditions implements Obser { private float temperature; private float pressure; private float humidity; public void updata(float temperature, float pressure, float humidity){ this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; display(); } public void display(){ System.out.println("*** Taday Temperature:" + temperature + "***"); System.out.println("*** Taday Pressure:" + pressure + "***"); System.out.println("*** Taday Humidity:" + humidity + "***"); } }

Step 3) 创建 BaiduSite 抽象类:

public class BaiduSite implements Obser{ private float temperature; private float pressure; private float humidity; public void updata(float temperature, float pressure, float humidity){ this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; display(); } public void display(){ System.out.println("*** 百度网站 Temperature:" + temperature + "***"); System.out.println("*** 百度网站 Pressure:" + pressure + "***"); System.out.println("*** 百度网站 Humidity:" + humidity + "***"); } }

Step 4) 创建 SinaSite 实现类:

public class SinaSite implements Obser{ private float temperature; private float pressure; private float humidity; public void updata(float temperature, float pressure, float humidity){ this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; display(); } public void display(){ System.out.println("*** Sina Temperature:" + temperature + "***"); System.out.println("*** Sina Pressure:" + pressure + "***"); System.out.println("*** Sina Humidity:" + humidity + "***"); } }

Step 5) 创建 Subject 接口:

public interface Subject { public void registerObserver(Obser o); public void removeObserver(Obser o); public void notifyObservers(); }

Step 6) 创建 WeatherData 实现类:

public class WeatherData implements Subject { private float temperature; private float pressure; private float humidity; private ArrayList<Obser> obsers; public WeatherData() { obsers = new ArrayList<>(); } public float getTemperature() { return temperature; } public float getPressure() { return pressure; } public float getHumidity() { return humidity; } public void dataChange(){ notifyObservers(); } public void setData(float temperature, float pressure, float humidity) { this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; dataChange(); } @Override public void registerObserver(Obser o) { obsers.add(o); } @Override public void removeObserver(Obser o) { if(obsers.contains(o)){ obsers.remove(o); } } @Override public void notifyObservers() { for(int i=0; i<obsers.size(); i++){ obsers.get(i).updata(this.temperature, this.pressure, this.humidity); } } }

Step 7) 创建 main 方法:

public class Client { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditions currentConditions = new CurrentConditions(); BaiduSite baiduSite = new BaiduSite(); SinaSite sinaSite = new SinaSite(); weatherData.registerObserver(currentConditions); weatherData.registerObserver(baiduSite); weatherData.registerObserver(sinaSite); System.out.println("通知各个注册的观察着,查看信息"); weatherData.setData(10f, 100f, 30.3f); } }

• 由 ChiKong_Tam 写于 2020 年 10 月 21 日

最新回复(0)