简介
说明
本文介绍不用适配器模式时的业务写法。
缺点
- 在业务中直接处理数据,不符合单一职责原则。
- 在新加逻辑时会很麻烦,导致代码又臭又长
实战
项目需求:有一个物联网项目,要去控制灯的开和关。
项目结构
可以看到,上边分了两个包: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设备已关灯
请先
!