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

场景

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

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

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

观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
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);
    }
}

猜你喜欢

转载自blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/133772928