适配器模式的定义
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式的本质是:转换匹配,复用功能
结构图
这里主要介绍两种适配器的实现方式(类适配器&对象适配器)
首先,我们先创建一个BaseService及其实现:
package com.mk.designDemo.designs.adapter;
public interface BaseService {
void doExecute(String param);
}
package com.mk.designDemo.designs.adapter.impl;
import com.mk.designDemo.designs.adapter.BaseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BaseServiceImpl implements BaseService {
private final static Logger logger = LoggerFactory.getLogger(BaseServiceImpl.class);
@Override
public void doExecute(String param) {
logger.info("BaseService doExecute param:{}", param);
// 复杂的实现逻辑
}
}
然后我们现在要做一个新的service,发现与BaseService内部实现功能是一样的,只是参数不同。我们先定义好ExtensionService:
package com.mk.designDemo.designs.adapter;
public interface ExtensionService {
void execute(Integer param);
}
类适配器的实现方法:
package com.mk.designDemo.designs.adapter;
import com.mk.designDemo.designs.adapter.impl.BaseServiceImpl;
public class ClassAdapter extends BaseServiceImpl implements ExtensionService {
@Override
public void execute(Integer param) {
doExecute(String.valueOf(param));
}
}
对象适配器的实现方法:
package com.mk.designDemo.designs.adapter;
import java.util.Optional;
/**
* 对象适配器,通过implements适配者来实现
*/
public class ObjectAdapter implements ExtensionService {
private BaseService baseService;
public ObjectAdapter(BaseService baseService) {
this.baseService = baseService;
}
@Override
public void execute(Integer param) {
baseService.doExecute(Optional.ofNullable(param).orElse(0).toString());
}
}
测试类:
package com.mk.designDemo.adapter;
import com.mk.designDemo.designs.adapter.ClassAdapter;
import com.mk.designDemo.designs.adapter.ObjectAdapter;
import com.mk.designDemo.designs.adapter.impl.BaseServiceImpl;
import org.junit.Test;
public class AdapterTest {
@Test
public void testObjectAdapter() {
ObjectAdapter objectAdapter = new ObjectAdapter(new BaseServiceImpl());
objectAdapter.execute(10);
}
@Test
public void testClassAdapter() {
ClassAdapter classAdapter = new ClassAdapter();
classAdapter.execute(20);
}
}
我们这边可以看到,ExtensionService 并没有把BaseService中复杂的业务逻辑再写一遍,极大的提高了系统代码的复用性。由于类适配器是采用对象继承的方式,所以只能做单个对象的适配,如果我们存在多个对象的适配,最好使用对象适配器来实现。
优缺点
- 优点:
更好的复用性,更好的可扩展性 - 缺点:
过多的使用适配器,会让系统非常凌乱,不容易整体进行把握