简介
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。读卡器,转接头等都可看成适配器模式在生活中的应用。
类图d
代码
/** * 目标(Target),要转换成的目标接口 * @author: 张彬 * @date: 2018年5月15日 下午4:32:35 * @version: V1.0 * @review: 张彬/2018年5月15日 下午4:32:35 */ public interface Target { public void sampleOperation1(); public void sampleOperation2(); }
/** * 源(Adaptee),需要被转换的源接口 * @author: 张彬 * @date: 2018年5月15日 下午4:34:05 * @version: V1.0 * @review: 张彬/2018年5月15日 下午4:34:05 */ public class Adaptee { public void sampleOperation1() { System.out.println("sampleOperation1"); } }
/** * 对象适配,核心是实现Target接口, 组合Adaptee接口 * @author: 张彬 * @date: 2018年5月15日 下午4:36:25 * @version: V1.0 * @review: 张彬/2018年5月15日 下午4:36:25 */ public class ObjectAdapter implements Target { private Adaptee adaptee; public ObjectAdapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void sampleOperation1() { adaptee.sampleOperation1(); } @Override public void sampleOperation2() { System.out.println("sampleOperation2"); } }
/** * 类适配器,核心是继承Adaptee类,实现Target接口 * @author: 张彬 * @date: 2018年5月15日 下午4:40:45 * @version: V1.0 * @review: 张彬/2018年5月15日 下午4:40:45 */ public class ClassAdapter extends Adaptee implements Target { @Override public void sampleOperation2() { System.out.println("sampleOperation2"); } }
/** * 客户端 * @author: 张彬 * @date: 2018年5月15日 下午4:49:29 * @version: V1.0 * @review: 张彬/2018年5月15日 下午4:49:29 */ public class Client { public static void main(String[] args) { //对象适配 ObjectAdapter objectAdapter = new ObjectAdapter(new Adaptee()); objectAdapter.sampleOperation1(); objectAdapter.sampleOperation2(); System.out.println("--------------------"); //类适配 Target classAdapter = new ClassAdapter(); classAdapter.sampleOperation1(); classAdapter.sampleOperation2(); } }
输出结果:
sampleOperation1 sampleOperation2 -------------------- sampleOperation1 sampleOperation2
总结
优点
- 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
- 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
- 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。
- 类适配器-由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
- 对象适配器-可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
缺点
- 类适配器模式的缺点是适配器类在很多编程语言中不能同时适配多个适配者类;
- 对象适配器模式的缺点是很难置换适配者类的方法
当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们在创建抽象类的继承类,而且重写我们需要使用的那几个方法即可。