java设计模式观察者模式_我的世界Java自由视角

(54) 2024-08-19 12:01:03

目录

观察者模式:

观察者模式优点:

观察者模式应用:

观察者实例:

上述代码 GitHub 地址:https://github.com/baicun/designPatterns


观察者模式:

对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。

观察者模式优点:

第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。

第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,

观察者模式应用:

Spring ApplicationContext 机制中的观察者模式

JDK 委托事件模型DEM中的观察者模式

观察者实例:

类图:

java设计模式观察者模式_我的世界Java自由视角 (https://mushiming.com/)  第1张

观察者接口:

public interface Observer { public void update(float mTemperature, float mPresure, float mHumidity); }

A观察者实现类:

public class CurrentConditionsA implements Observer{ private float mTemperature; private float mPresure; private float mHumidity; public void update(float mTemperature, float mPresure, float mHumidity){ this.mTemperature = mTemperature; this.mPresure = mPresure; this.mHumidity = mHumidity; display(); } public void display(){ System.out.println("今天的温度:"+mTemperature); System.out.println("今天的气压:"+mPresure); System.out.println("今天的湿度:"+mHumidity); } }

B观察者实现类: 

public class CurrentConditionsB implements Observer{ private float mTemperature; private float mPresure; private float mHumidity; public void update(float mTemperature, float mPresure, float mHumidity){ this.mTemperature = mTemperature; this.mPresure = mPresure; this.mHumidity = mHumidity; display(); } public void display(){ System.out.println("明天的温度:"+mTemperature); System.out.println("明天的气压:"+mPresure); System.out.println("明天的湿度:"+mHumidity); } }

 被观察者接口:

public interface Subject { //观察者注册 public void registerObserver(Observer observer); // 观察者移除 public void removeObserver(Observer observer); // 观察者通知 public void notifyObserver(); }

被观察者接口实现:

public class WeatherData implements Subject { private float mTemperature; private float mPresure; private float mHumidity; private ArrayList<Observer> observerArrays; public WeatherData(){ observerArrays = new ArrayList<Observer>(); } public float getmTemperature() { return mTemperature; } public void setmTemperature(float mTemperature) { this.mTemperature = mTemperature; } public float getmPresure() { return mPresure; } public void setmPresure(float mPresure) { this.mPresure = mPresure; } public float getmHumidity() { return mHumidity; } public void setmHumidity(float mHumidity) { this.mHumidity = mHumidity; } public void dataChange(){ notifyObserver(); } public void setData(float mTemperature, float mPresure, float mHumidity){ this.mTemperature = mTemperature; this.mPresure = mPresure; this.mHumidity = mHumidity; dataChange(); } @Override public void registerObserver(Observer observer) { observerArrays.add(observer); } @Override public void removeObserver(Observer observer) { if(observerArrays.contains(observer)){ observerArrays.remove(observer); } } @Override public void notifyObserver() { for(Observer obs : observerArrays){ obs.update(getmTemperature(),getmPresure(),getmHumidity()); } } }

通过通知接口,实现观察者通知 

测试类:

public class mainTest { public static void main(String[] args){ WeatherData weatherData = new WeatherData(); CurrentConditionsA currentConditionsA = new CurrentConditionsA(); CurrentConditionsB currentConditionsB = new CurrentConditionsB(); weatherData.registerObserver(currentConditionsA); weatherData.registerObserver(currentConditionsB); weatherData.setData(30,150,60); weatherData.removeObserver(currentConditionsA); weatherData.setData(90,350,70); } }

 

上述代码 GitHub 地址:https://github.com/baicun/designPatterns

 

 

 

 

THE END

发表回复