结构型 之 适配器模式

定义

把一个类的接口变换成客户端所期待的另一种接口,从而是原本因接口不匹配而无法在一起工作的两个类能够一起工作。

分类

类适配器、对象适配器、接口适配器。

应用场景

实际项目开发过程中,每个人都会各自写自己的业务服务类,如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     @Override
10     public void a() {}
11     @Override
12     public void b() {}
13     @Override
14     public void c() {}
15     @Override
16     public void d() {}
17 }
18  
19 public class AdapterB extends  AbstractA{
20     @Override
21     public void a() {
22         System.out.println("AdapterB 只需要关注a()方法");
23     }
24 }
25  
26 public class AdapterC extends  AbstractA{
27     @Override
28     public void b() {
29         System.out.println("AdapterC 只需要关注a()方法");
30     }
31 }

 

posted @ 2018-08-30 20:54  娃力先生  阅读(140)  评论(0编辑  收藏  举报