• 设计模式-观察者模式在Java中的使用示例-环境监测系统


    场景

    设计模式-观察者模式在Java中的使用示例:

    设计模式-观察者模式在Java中的使用示例_java观察者模式实例-CSDN博客

    上面讲的观察者模式的一个示例,下面记录摘自软件设计师案例分析的一个示例-环境监测系统。

    观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
    Observer模式适用于

    1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立对象中以使它们可以各自单独地改变和复用

    2、当对一个对象的改变需要同时改变其他对象,而不知道具体由多少对象有待改变时

    3、当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即:不希望这些对象是紧耦合的

    观察者模式角色:

    Subject:

    抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,

    抽象主题提供一个接口,可以增加和删除观察者对象。

    ConcreteSubject:

    具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,

    给所有注册过的观察者发送通知。

    Observer:

    抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。

    ConcrereObserver:

    具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi 

    实现

    某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及清洁度等环境数据。

    当获取到最新的环境监测数据时,显示的环境数据能够更新。

    新建Subject抽象主题

    1. public interface Subject {
    2.     //注册对主题感兴趣的观察者
    3.     public void registerObserver(Observer observer);
    4.     //删除观察者
    5.     public void removeObserver(Observer observer);
    6.     //当主题发生变化时通知观察者
    7.     public void notifyObserver();
    8. }

    新建抽象观察者

    1. public interface Observer {
    2.     public void update(float temp,float humidity,float cleanness);
    3. }

    新建具体主题

    1. import java.util.ArrayList;
    2. public class EnvironmentData implements Subject{
    3.     private ArrayList observers;
    4.     private float temperature,humidity,cleanness;
    5.     public EnvironmentData(){
    6.         observers = new ArrayList();
    7.     }
    8.     @Override
    9.     public void registerObserver(Observer observer) {
    10.         observers.add(observer);
    11.     }
    12.     @Override
    13.     public void removeObserver(Observer observer) {
    14.         observers.remove(observer);
    15.     }
    16.     @Override
    17.     public void notifyObserver() {
    18.         for (int i = 0; i < observers.size(); i++) {
    19.             Observer observer = (Observer) observers.get(i);
    20.             observer.update(temperature,humidity,cleanness);
    21.         }
    22.     }
    23.     public void measuresChanged(){
    24.         notifyObserver();
    25.     }
    26.     public void setMeasurements(float temperature,float humidity,float cleanness){
    27.         this.temperature = temperature;
    28.         this.humidity = humidity;
    29.         this.cleanness = cleanness;
    30.         measuresChanged();
    31.     }
    32. }

    新建具体观察者

    1. public class CurrentConditionsDisplay implements Observer{
    2.     private float temperature;
    3.     private float humidity;
    4.     private float cleanness;
    5.     private Subject envData;
    6.     public CurrentConditionsDisplay(Subject envData){
    7.         this.envData = envData;
    8.         envData.registerObserver(this);
    9.     }
    10.     @Override
    11.     public void update(float temperature, float humidity, float cleanness) {
    12.         this.temperature = temperature;
    13.         this.humidity = humidity;
    14.         this.cleanness = cleanness;
    15.         display();
    16.     }
    17.     public void display(){
    18.         //代码省略
    19.     }
    20. }

    客户端调用

    1. public class EnvironmentMonitor {
    2.     public static void main(String[] args) {
    3.         EnvironmentData envData = new EnvironmentData();
    4.         CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(envData);
    5.         envData.setMeasurements(80,60,50);
    6.     }
    7. }

  • 相关阅读:
    使用writev将多个小数据包合并发送,使用sysconf(_SC_IOV_MAX)查看writev函数最多允许数组大小
    websocket通信案例
    帧同步相关总结
    团队如何选择合适的Git分支策略?
    学生护眼台灯哪个牌子最好?2022双十二4款儿童护眼写字灯推荐
    (三)爬取一些网页图片
    Java注解
    Mini Linux嵌入式设备服务器
    16个值得推荐的.NET ORM框架
    Flink--8、时间语义、水位线(事件和窗口、水位线和窗口的工作原理、生产水位线、水位线的传递、迟到数据的处理)
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/133772928