1、适配器模式简介
定义:将一个类的接口转换成另外一个接口,使得两个接口兼容,适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些
目标:使不能在一工作的两个接口可以兼容一起工作
解决问题:解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的
优点:客户端通过适配器可以透明地调用目标接口
复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类
将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题
在很多业务场景中符合开闭原则
缺点:适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性
增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱
实现:
角色:目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口
适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者
代码:
1 /**类适配器模式**/ 2 public class classAdapter { 3 /**目标接口**/ 4 public interface Target{ 5 public void request(); 6 } 7 /**适配者**/ 8 static class Adaptee{ 9 public void specRequest(){ 10 System.out.println("适配者被调用"); 11 } 12 } 13 /**适配器类**/ 14 static class adapter extends Adaptee implements Target{ 15 @Override 16 public void request(){ 17 specRequest(); 18 } 19 } 20 /**测试方法**/ 21 public static void main(String[] args) { 22 System.out.println("开始适配器测试"); 23 Target target = new adapter(); 24 target.request(); 25 System.out.println("测试结束"); 26 } 27 } 28 29 测试结果: 30 开始适配器测试 31 适配者被调用 32 测试结束
1 /**对象适配模式**/ 2 public class objectAdapter { 3 /**目标接口**/ 4 public interface Target{ 5 public void request(); 6 } 7 /**适配者**/ 8 static class Adaptee{ 9 public void specRequest(){ 10 System.out.println("适配者被调用"); 11 } 12 } 13 /**适配器类**/ 14 static class objectAdaptee implements Target { 15 private Adaptee adaptee; 16 public objectAdaptee(Adaptee adaptee){ 17 this.adaptee = adaptee; 18 } 19 @Override 20 public void request(){ 21 adaptee.specRequest(); 22 } 23 } 24 /**测试方法**/ 25 public static void main(String[] args) { 26 System.out.println("开始适配器测试"); 27 Adaptee adaptee = new Adaptee(); 28 Target target = new objectAdaptee(adaptee); 29 target.request(); 30 System.out.println("测试结束"); 31 } 32 } 33 34 测试结果: 35 开始适配器测试 36 适配者被调用 37 测试结束