首页 > 其他分享 >大话设计模式之单例,策略,简单工厂

大话设计模式之单例,策略,简单工厂

时间:2023-06-03 16:46:07浏览次数:35  
标签:return String 大话 getSensorType SensorEeum 单例 new 设计模式 public

基于实际面试题实现

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 用java设计一个机房环境监测系统的代码框架,机房有多种传感器,可以实时检测机房的温度、湿度、噪音等数据,
 * 并把数据实时发送到监控中心,其中某项数据超过不健康阈值立即上报到监控中心显示
 * 要求:
 * 1、程序可以检测并展示机房温度、湿度、噪音等数据。
 * 2、程序至少使用一种设计模式
 * 3、程序需要考虑可扩展性和易维护性
 * 4、有良好的编程规范
 * 5、不要依赖除jdk以外的库
 */

public class Demo {
    public static void main(String[] args) {

        while (true) {
            //传感器实时监听
            Room room = new Room("机房1");
            monitoringCenter(room);
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    public static void monitoringCenter(Room room) {
        //发送道监控中心
        room.getSensorMap().forEach((sensorEeum, integer) -> {
            SensorStrategyFactory sensorStrategyFactory = SensorStrategyFactory.getFactory();
            SensorStrategy sensorStrategy = sensorStrategyFactory.getSensorStrategy(sensorEeum);
            boolean unHealthy = sensorStrategy.unHealthy(integer);
            if (unHealthy) {
                //超过不健康阈值立即上报到监控中心显示
                System.out.println(room.getRoomName() + "--" + sensorEeum.getErrMsg());
            }
        });
    }
}


class Room {
    /**
     * 传感器组合
     */
    private Map<SensorEeum, Integer> sensorMap = new HashMap<>();
    /**
     * 房间名称
     */
    private String roomName;

    /**
     * 实时监控
     */
    public Room(String roomName) {
        Map<SensorEeum, Integer> map = new HashMap<>();
        map.put(SensorEeum.TEMPERATURE, new Random().nextInt(100));
        map.put(SensorEeum.WET, new Random().nextInt(200));
        map.put(SensorEeum.NOISE, new Random().nextInt(400));
        this.sensorMap = map;
        this.roomName = roomName;
    }

    public Map<SensorEeum, Integer> getSensorMap() {
        return sensorMap;
    }

    public void setSensorMap(Map<SensorEeum, Integer> sensorMap) {
        this.sensorMap = sensorMap;
    }

    public String getRoomName() {
        return roomName;
    }

    public void setRoomName(String roomName) {
        this.roomName = roomName;
    }
}

/**
 * 策略工厂(简单工厂模式,单例模式)
 */
class SensorStrategyFactory {
    private static final Map<SensorEeum, SensorStrategy> sensorStrategyMap = new HashMap<>();

    private static SensorStrategyFactory factory = null;

    static {
        SensorStrategy temperatureSensorStrategy = new TemperatureSensorStrategy();
        sensorStrategyMap.put(temperatureSensorStrategy.getSensorType(), temperatureSensorStrategy);
        SensorStrategy wetSensorStrategy = new WetSensorStrategy();
        sensorStrategyMap.put(wetSensorStrategy.getSensorType(), wetSensorStrategy);
        SensorStrategy noiseSensorStrategy = new NoiseSensorStrategy();
        sensorStrategyMap.put(noiseSensorStrategy.getSensorType(), noiseSensorStrategy);
    }

    private SensorStrategyFactory() {
    }

    public static SensorStrategyFactory getFactory() {
        if (factory == null) {

            //双重锁定
            synchronized (SensorStrategyFactory.class) {
                if (factory == null) {
                    factory = new SensorStrategyFactory();
                }
            }
        }
        return factory;
    }

    public SensorStrategy getSensorStrategy(SensorEeum sensorEeum) {
        if (sensorStrategyMap.containsKey(sensorEeum)) {
            return sensorStrategyMap.get(sensorEeum);
        }
        return null;
    }
}

/**
 * 传感器处理策略(策略模式)
 */
interface SensorStrategy {
    SensorEeum getSensorType();

    boolean unHealthy(int value);
}

abstract class abstractSensorStrategy implements SensorStrategy {
    @Override
    public boolean unHealthy(int value) {
        if (value > getSensorType().getSensorThreshold()) {
            return true;
        }
        return false;
    }
}

/**
 * 温度处理策略
 */
class TemperatureSensorStrategy extends abstractSensorStrategy {

    @Override
    public SensorEeum getSensorType() {
        return SensorEeum.TEMPERATURE;
    }


}

/**
 * 湿度处理策略
 */
class WetSensorStrategy extends abstractSensorStrategy {
    @Override
    public SensorEeum getSensorType() {
        return SensorEeum.WET;
    }

}

/**
 * 噪音处理策略
 */
class NoiseSensorStrategy extends abstractSensorStrategy {
    @Override
    public SensorEeum getSensorType() {
        return SensorEeum.NOISE;
    }

    @Override
    public boolean unHealthy(int value) {
        if (value > getSensorType().getSensorThreshold()) {
            return true;
        }
        return false;
    }
}

/**
 * 处理器枚举
 */
enum SensorEeum {
    TEMPERATURE("temperature", 50, "温度异常,请排查机房"),
    WET("wet", 100, "湿度异常,请排查机房"),
    NOISE("noise", 200, "噪音异常,请排查机房"),
    ;

    SensorEeum(String sensorType, int sensorThreshold, String errMsg) {
        this.sensorType = sensorType;
        this.sensorThreshold = sensorThreshold;
        this.errMsg = errMsg;
    }

    private String sensorType;
    private int sensorThreshold;
    private String errMsg;

    public String getSensorType() {
        return sensorType;
    }

    public int getSensorThreshold() {
        return sensorThreshold;
    }

    public String getErrMsg() {
        return errMsg;
    }
}

 

标签:return,String,大话,getSensorType,SensorEeum,单例,new,设计模式,public
From: https://www.cnblogs.com/dingpl/p/17454179.html

相关文章

  • 单例模式8种写法
    0.为什么需要单例模式?节省内存和计算保证结果正确方便管理使用场景:1.饿汉式(静态常量)—推荐指数:★★☆☆☆优点:不会有线程安全问题。缺点:在类加载的时候就创建对象,如果一直没使用到该对象的话,就造成了内存浪费,如果对象初始化的工作有很多,也会影响到性能。代码展示://......
  • 单例模式的运用
    目录一、介绍二、饿汉式2.1静态变量方式2.2静态代码块方式2.3枚举方式三、懒汉式3.1线程不安全方式3.2线程安全方式3.3双重检查锁方式3.4静态内部类方式四、破坏单例模式4.1序列化破坏4.2序列化破坏解决办法4.3反射破坏4.4反射破坏解决办法一、介绍单例模式:属于创建......
  • 移动开发之设计模式-组合模式(IOS&Android)
    组合模式组合模式(CompositePattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相......
  • java单例模式几种实现方式
    1、饿汉式(线程安全,调用效率高,但是不能延时加载):publicclassImageLoader{privatestaticImageLoaderinstance=newImageLoader;privateImageLoader(){}publicstaticImageLoadergetInstance(){returninstance;}}一上来就把单例对象创建出来了,要用的时候直......
  • 设计模式
    设计模式介绍设计模式是程序员在面对同类软件工程设计问题所总结出来的有用经验,是某类问题的通用解决方案。作用:使程序(软件)具有更好:代码重用性(即相同功能的代码,不用多次编写)可读性(即编程规范性,便于其他程序员的阅读和理解)可扩展性(即:当需要增加新的功能时,非常的方便,称为可维......
  • 设计模式小记
    创建型模式(CreationalPatterns):工厂模式(FactoryPattern):通过工厂方法创建对象,隐藏具体实现细节,例如创建不同类型的按钮。//简单工厂模式classButtonFactory{createButton(type){switch(type){case'submit':returnnewSubmitButton();......
  • 设计模式详解之抽象工厂模式--企业的运行模式
    前言本文主要讲述设计模式中的抽象工厂模式,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。一.什么是抽象工厂模式抽象工厂是23种设计模式中创建型模式的一种,抽象工厂是由多个工厂组合而成。上一章我们提到的工厂模式只存在一个抽象角色,而抽象工厂是......
  • golang实现设计模式之享元模式总结-代码、优缺点、适用场景
    享元模式是一种结构型的设计模式,通过共享细粒度对象实现对象的复用,从而达到减少对象创建与销毁,减少内存消耗,其本质是本质是缓存共享对象,降低内存消耗。享元模式的定义提出了两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会使对象数量多且性质相近,此时我们就将这些对象......
  • Java设计模式之单例模式
    一、何谓单例模式?单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模式的一种。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一......
  • javascript设计模式-责任链
    责任链可以用来消除请求的发送者和接收者之间的耦合,这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的。链中的每个对象可以处理请求,也可以将其传给下一个对象。JS内部就使用了这种模式来处一事件捕获和冒泡问题。一般的结构如下:发送者知道链中的第一个接收者,它向这个......