定义
把一个类的接口变换成客户端所期待的另一种接口,从而是原本因接口不匹配而无法在一起工作的两个类能够一起工作。
分类
类适配器、对象适配器、接口适配器。
应用场景
实际项目开发过程中,每个人都会各自写自己的业务服务类,如ExcelImportServiceImpl、CaculateServiceImpl、ExcelExportServiceImpl。各个业务服务类都是独自写各自的服务方法,这些业务服务类都有各自的接口。现在这些业务服务类要被多线程统一调用,线程服务类接口是IThreadService,如何通过接口doBusiness()方法实现统一调用各个业务服务类。
解决方案:由于各个业务服务类的方法都是不规则的,因此需要为各个服务类分别定义一个适配器类Adapter,适配器继承业务服务类并且实现线程服务类,通过调用适配器类实现间接的调用各个业务服务类。
1.类适配器
当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。
目标类Target
/** * 业务服务类接口,在适配器模式中也称为目标类 */public interface IExcelImportService { RspDto execute();} public class ExcelImportServiceImpl implements IExcelImportService { public RspDto execute() { System.out.println("导入Excel文件"); return null; }
客户端Client接口,也是调用者
public interface IThreadService { RspDto doBusiness();}
适配器
public class ExcelImportServiceAdapter extends ExcelImportServiceImpl implements IThreadService { @Override public RspDto doBusiness() { execute(); }}
测试代码
public class Test { public static void main(String[] args){ IThreadService service = new ExcelImportServiceAdapter(); service.doBusiness(); }}
2.对象适配器
/** * 业务服务类接口,在适配器模式中也称为目标类 */public interface IExcelImportService { RspDto execute();} public class ExcelImportServiceImpl implements IExcelImportService { public RspDto execute() { System.out.println("导入Excel文件"); return null; }} public interface IThreadService { RspDto doBusiness();} /** * Adapter中添加一个属性保存服务类对象 */public class ExcelImportServiceAdapter implements IThreadService {private IExcelImportService excelImportService ;public ExcelImportServiceAdapter(IExcelImportService excelImportService){ this.excelImportService = excelImportService;} @Override public RspDto doBusiness() { excelImportService.execute(); }} //测试public class Test { public static void main(String[] args){ ExcelImportServiceImpl excelImportService = new ExcelImportServiceImpl(); IThreadService service = new ExcelImportServiceAdapter(excelImportService ); service.doBusiness(); }}
3.接口适配器
1 public interface A { 2 void a(); 3 void b(); 4 void c(); 5 void d(); 6 } 7 8 public class AbstractA implements A{ 9 @Override10 public void a() {}11 @Override12 public void b() {}13 @Override14 public void c() {}15 @Override16 public void d() {}17 }18 19 public class AdapterB extends AbstractA{20 @Override21 public void a() {22 System.out.println("AdapterB 只需要关注a()方法");23 }24 }25 26 public class AdapterC extends AbstractA{27 @Override28 public void b() {29 System.out.println("AdapterC 只需要关注a()方法");30 }31 }