场景
设计模式-观察者模式在Java中的使用示例:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127664928
上面讲的观察者模式的一个示例,下面记录摘自软件设计师案例分析的一个示例-环境监测系统。
观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
Observer模式适用于
1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立对象中以使它们可以各自单独地改变和复用
2、当对一个对象的改变需要同时改变其他对象,而不知道具体由多少对象有待改变时
3、当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即:不希望这些对象是紧耦合的
观察者模式角色:
Subject:
抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,
抽象主题提供一个接口,可以增加和删除观察者对象。
ConcreteSubject:
具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,
给所有注册过的观察者发送通知。
Observer:
抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
ConcrereObserver:
具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及清洁度等环境数据。
当获取到最新的环境监测数据时,显示的环境数据能够更新。
新建Subject抽象主题
public interface Subject { //注册对主题感兴趣的观察者 public void registerObserver(Observer observer); //删除观察者 public void removeObserver(Observer observer); //当主题发生变化时通知观察者 public void notifyObserver(); }
新建抽象观察者
public interface Observer { public void update(float temp,float humidity,float cleanness); }
新建具体主题
import java.util.ArrayList; public class EnvironmentData implements Subject{ private ArrayList observers; private float temperature,humidity,cleanness; public EnvironmentData(){ observers = new ArrayList(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObserver() { for (int i = 0; i < observers.size(); i++) { Observer observer = (Observer) observers.get(i); observer.update(temperature,humidity,cleanness); } } public void measuresChanged(){ notifyObserver(); } public void setMeasurements(float temperature,float humidity,float cleanness){ this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; measuresChanged(); } }
新建具体观察者
public class CurrentConditionsDisplay implements Observer{ private float temperature; private float humidity; private float cleanness; private Subject envData; public CurrentConditionsDisplay(Subject envData){ this.envData = envData; envData.registerObserver(this); } @Override public void update(float temperature, float humidity, float cleanness) { this.temperature = temperature; this.humidity = humidity; this.cleanness = cleanness; display(); } public void display(){ //代码省略 } }
客户端调用
public class EnvironmentMonitor { public static void main(String[] args) { EnvironmentData envData = new EnvironmentData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(envData); envData.setMeasurements(80,60,50); } }