栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式——JDK中的观察者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式——JDK中的观察者模式

用JDK的中观察者模式实现对温度的监控。每两秒钟会去实时的监测环境的温度,环境温度低于35度时为正常温度,否则为异常温度,当连续监测超温达到临界值时,会向配置的邮箱发送警示邮件

1定义温度监测条件
public class Condition {

    //临界温度
    private int limitTemperature;
    //连续达到临界次数
    private int limitCount;
    //连续达到临界次数发送的邮件对象
    private String mail;

    public Condition() {
    }

    public Condition(int limitTemperature, int limitCount, String mail) {
        this.limitTemperature = limitTemperature;
        this.limitCount = limitCount;
        this.mail = mail;
    }

    public int getLimitTemperature() {
        return limitTemperature;
    }

    public void setLimitTemperature(int limitTemperature) {
        this.limitTemperature = limitTemperature;
    }

    public int getLimitCount() {
        return limitCount;
    }

    public void setLimitCount(int limitCount) {
        this.limitCount = limitCount;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

}

2定义温度变化的主题

public class TemperatureSubject extends Observable {


    private  int randomTemperature;

    private Condition condition;


    public Condition getCondition() {
        return condition;
    }

    public void setCondition(Condition condition) {
        this.condition = condition;
    }


    public int getRandomTemperature() {
        return randomTemperature;
    }

    public void setRandomTemperature(int randomTemperature) {

        this.randomTemperature = randomTemperature;
        //更新数据
        setChanged();
        //将条件对象传递给各个观察者
        notifyObservers(condition);
    }
}
3定义观察者
public class AbnormalTemperatureObserver  implements Observer {

    //默认临界次数为0
    private int qty=0;

    @Override
    public void update(Observable o, Object arg) {
        TemperatureSubject subject=(TemperatureSubject)o;
        Condition condition=(Condition)arg;

        if(subject.getRandomTemperature()>=condition.getLimitTemperature()){
            qty++;
            saveToDataBase(subject);
        }else{
            //未达到临界时,连续超温记录被中断,将临界次数归零
            qty=0;
            saveToDataBase(subject);
        }


        if(qty>=condition.getLimitCount()){
            sendMail(condition);
        }

    }


    
    public void saveToDataBase(TemperatureSubject subject){
        //模拟记录温度数值
        System.out.println("当前温度为"+subject.getRandomTemperature());
    }


    public void sendMail(Condition condition){
        System.out.println("发送邮件"+condition.getMail());
    }

}
public class NormalTemperatureObserver implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        TemperatureSubject subject=(TemperatureSubject)o;
        Condition condition=(Condition)arg;
        if(subject.getRandomTemperature()
            //模拟记录温度数值
            System.out.println("当前温度为"+subject.getRandomTemperature());
        }
    }
}

4 测试
public class Main {
    private static final   int RANDOM_SECONDS=2;
    public static void main(String[] args) {
        int[] array=new int []{30,35,29,33,31,34,35,32,30,25};
        Condition condition=new Condition(30,5,"it-api@mail.foxconn.com");

        TemperatureSubject sub=new TemperatureSubject();
        //设置变量
        sub.setCondition(condition);

        NormalTemperatureObserver observer1=new NormalTemperatureObserver();
        AbnormalTemperatureObserver observer2=new AbnormalTemperatureObserver();
        //注册观察者
        sub.addObserver(observer1);
        sub.addObserver(observer2);

        for(int i=0;i
            int tempNum=array[i];
            sub.setRandomTemperature(tempNum);
            try {
                //休眠两秒后继续观测变化的温度数据
                TimeUnit.SECONDS.sleep(RANDOM_SECONDS);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

测试结果如下

当前温度为30
当前温度为35
当前温度为29
当前温度为29
当前温度为33
当前温度为31
当前温度为34
当前温度为35
当前温度为32
发送邮件it-api@mail.foxconn.com
当前温度为30
当前温度为25
当前温度为25

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/930108.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号