所有分类
  • 所有分类
  • 未分类

适配器模式Java实战–不用设计模式的写法

简介

说明

本文介绍不用适配器模式时的业务写法。

缺点

  1. 在业务中直接处理数据,不符合单一职责原则。
  2. 在新加逻辑时会很麻烦,导致代码又臭又长

实战

项目需求:有一个物联网项目,要去控制灯的开和关。

项目结构

可以看到,上边分了两个包:controlDevice包和device包。controlDevice包是互联网项目结构,包括Controller、Service等;device包可以认为是灯具厂商给的SDK包。

controlDevice包

BO

package com.knife.designPattern.controlDevice.bo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@ApiModel("控制设备入参")
@Data
public class ControlDeviceBO {
    @ApiModelProperty("设备的ID")
    private String deviceId;

    @ApiModelProperty("开/关。true:开。false:关")
    private Boolean openClose;
}

Controller

package com.knife.designPattern.controlDevice.controller;

import com.knife.designPattern.controlDevice.bo.ControlDeviceBO;
import com.knife.designPattern.controlDevice.service.ControlDeviceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "控制设备")
@RestController
@RequestMapping("controlDevice")
public class ControlDeviceController {
    @Autowired
    private ControlDeviceService controlDeviceService;

    @ApiOperation("开关灯")
    @PostMapping("lightOpenClose")
    public String lightOpenClose(@RequestBody ControlDeviceBO controlDeviceBO) {
        return controlDeviceService.lightOpenClose(controlDeviceBO);
    }

}

Service

package com.knife.designPattern.controlDevice.service;

import com.knife.designPattern.controlDevice.bo.ControlDeviceBO;
import com.knife.designPattern.device.light.LightBO;
import com.knife.designPattern.device.light.LightService;
import org.springframework.stereotype.Component;

@Component
public class ControlDeviceService {
    public String lightOpenClose(ControlDeviceBO controlDeviceBO) {
        System.out.println("上层:进入控制灯开关的service");

        // 新建一个实际控制灯的参数
        LightBO lightBO = new LightBO();
        lightBO.setLightId(controlDeviceBO.getDeviceId());
        lightBO.setOpen(controlDeviceBO.getOpenClose());

        // 直接去控制电灯
        LightService lightService = new LightService();
        lightService.control(lightBO);

        // 现在这种写法是最原始的写法,直接在这里进行参数的转换。
        // 如果换了底层的设备,这里就要新加代码,会越来越长。所以需要使用适配器模式

        return "success";
    }
}

device包

BO

package com.knife.designPattern.device.light;

import lombok.Data;

/**
 * 控制灯的入参
 */
@Data
public class LightBO {

    /**
     * 灯的ID
     */
    private String lightId;

    /**
     * true:开灯。false:关灯
     */
    private Boolean open;

}

Service

package com.knife.designPattern.device.light;

/**
 * 灯的控制逻辑
 */
public class LightService {
    /**
     * 控制设备
     */
    public void control(LightBO lightBO) {
        System.out.println("硬件层:开始直接控制灯");

        if (lightBO.getOpen()) {
            System.out.printf("%s设备已开灯\n", lightBO.getLightId());
        } else {
            System.out.printf("%s设备已关灯\n", lightBO.getLightId());
        }
    }
}

源码下载

此隐藏内容仅限VIP查看升级VIP

测试

访问:http://localhost:8080/doc.html

后端结果

上层:进入控制灯开关的service
硬件层:开始直接控制灯
12345设备已关灯
0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录