1. 什么是适配器模式
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2. 使用场景
适配器模式是将一个类的接口(被适配者)转换成客户希望的另外一个接口(目标)的成熟模式,该模式中涉及有目标、被适配者和适配器。适配器模式的关键是建立一个适配器,这个适配器实现了目标接口并包含有被适配者的引用。
3. 模式的结构与使用
模式的结构中包括三种角色:
- 目标(Target)
- 被适配者(Adaptee)
- 适配器(Adapter)
4. 简单例子
4.1 目标
package indi.peter.designpattern.adapter;
public interface ThreeElectricOutlet {
public abstract void connectElectricCurrent();
}
4.2 被适配者
public interface TwoElectricOutlet{
public abstract void connectElectricCurrent();
}
4.3 适配器
public class TreeElectricAdapter implements ThreeElectricOutlet{
TwoElectricOutlet outlet;
TreeElectricAdapter(TwoElectricOutlet outlet){
this.outlet=outlet;
}
public void connectElectricCurrent(){
outlet.connectElectricCurrent();
}
}
4.4 应用
package indi.peter.designpattern.adapter;
public class Application {
public static void main(String args[]) {
ThreeElectricOutlet outlet;
Wash wash = new Wash();
outlet = wash;
System.out.println("使用三相插座接通电流:");
outlet.connectElectricCurrent();
TV tv = new TV();
TreeElectricAdapter adapter = new TreeElectricAdapter(tv);
outlet = adapter;
System.out.println("使用三相插座接通电流:");
outlet.connectElectricCurrent();
}
}
class Wash implements ThreeElectricOutlet {
String name;
Wash() {
name = "黄河洗衣机";
}
Wash(String s) {
name = s;
}
public void connectElectricCurrent() {
turnOn();
}
public void turnOn() {
System.out.println(name + "开始洗衣物。");
}
}
class TV implements TwoElectricOutlet {
String name;
TV() {
name = "长江电视机";
}
TV(String s) {
name = s;
}
public void connectElectricCurrent() {
turnOn();
}
public void turnOn() {
System.out.println(name + "开始播放节目。");
}
}
5. 模式应用的开源框架
在Spring Boot中,适配器模式常用于不同层之间的数据转换,比如在Controller和Service层之间,或者在Service和Repository层之间。
以下是一个简单的Spring Boot适配器模式的例子:假设我们有一个服务层接口和实现,以及一个控制器,但是服务层返回的对象类型和控制器需要的对象类型不同。
服务层接口和实现:
public interface MyService {
MyServiceData performAction(MyServiceRequest request);
}
@Service
public class MyServiceImpl implements MyService {
@Override
public MyServiceData performAction(MyServiceRequest request) {
// 实现功能
return new MyServiceData();
}
}
控制器和所需的数据类型:
@RestController
@RequestMapping("/api")
public class MyController {
@Autowired
private MyService myService;
@GetMapping("/data")
public ResponseEntity<MyControllerData> getData(@RequestBody MyControllerRequest request) {
MyServiceData serviceData = myService.performAction(request.getServiceRequest());
MyControllerData controllerData = convertServiceDataToControllerData(serviceData);
return ResponseEntity.ok(controllerData);
}
private MyControllerData convertServiceDataToControllerData(MyServiceData serviceData) {
// 转换逻辑
return new MyControllerData();
}
}
class MyControllerRequest {
private MyServiceRequest serviceRequest;
// getter and setter
}
class MyServiceRequest {
// 请求数据结构
}
class MyControllerData {
// 控制器返回的数据结构
}
class MyServiceData {
// 服务层返回的数据结构
}
6. 模式优点
目标(Target)和被适配者(Adaptee)是完全解耦的关系。
适配器模式满足“开-闭原则”。当添加一个实现Adaptee接口的新类时,不必修改Adapter,Adapter就能对这个新类的实例进行适配。
富贵必从勤苦得,男儿须读五车书。加油少年郎!!!