简介
说明
本文介绍不用适配器模式时的业务写法。
缺点
- 在业务中直接处理数据,不符合单一职责原则。
- 在新加逻辑时会很麻烦,导致代码又臭又长
实战
项目需求:有一个物联网项目,要去控制灯的开和关。
项目结构

可以看到,上边分了两个包: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设备已关灯

请先 !