适配器模式指的是将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。
【分类】
- 类适配器模式:通过继承src类,实现dst类接口,完成src->dst的适配;
- 对象适配器模式:通过持有src类,实现dst类接口,完成src->dst的适配(使用组合关系来替代继承,推荐使用);
- 默认适配器模式:也叫接口适配器/缺省适配器,当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,适用于一个接口不想使用其所有的方法的情况。
【角色】
- 目标角色(Target):该角色定义把其他类转换为何种接口,也就是我们的期望接口。
- 源角色(Adaptee):需要转换成目标角色的源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新的角色。
- 适配器角色(Adapter):适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:把源角色通过继承或者类关联的方法转换为目标角色。
/*** 苹果手机(目标角色)*/public interface ApplePhone {/*** 苹果耳机*/void appleHeadset();/*** 苹果充电器*/void appleCharger();}
/*** 安卓手机(源角色)*/public interface AndroidPhone {/*** 安卓耳机*/void androidHeadset();/*** 安卓充电器*/void androidCharger();}
【类适配器模式】/*** 安卓手机(源角色)*/public class AndroidPhoneImpl implements AndroidPhone {@Overridepublic void androidHeadset() {System.out.println("安卓耳机");}@Overridepublic void androidCharger() {System.out.println("安卓充电器");}}
/*** 类适配器*/public class ClassAdapter extends AndroidPhoneImpl implements ApplePhone {@Overridepublic void appleHeadset() {System.out.println("[类适配器]使用了耳机适配器");androidHeadset();}@Overridepublic void appleCharger() {System.out.println("[类适配器]使用了充电器适配器");androidCharger();}}
【对象适配器模式】
/*** 对象适配器*/public class ObjectAdapter implements ApplePhone {private AndroidPhone androidPhone;public ObjectAdapter(AndroidPhone androidPhone) {this.androidPhone = androidPhone;}@Overridepublic void appleHeadset() {System.out.println("[对象适配器]使用了耳机适配器");androidPhone.androidHeadset();}@Overridepublic void appleCharger() {System.out.println("[对象适配器]使用了耳机适配器");androidPhone.androidCharger();}}
【默认适配器模式】
/*** 默认适配器(接口适配器/缺省适配器)*/public abstract class AbstractDefaultAdapter implements ApplePhone {@Overridepublic void appleHeadset() { }@Overridepublic void appleCharger() { }}
/*** 默认适配器实现类*/public class DefaultAdapter extends AbstractDefaultAdapter {@Overridepublic void appleHeadset() {System.out.println("[默认适配器]只适配了耳机");}}
public class AdapterTest {public static void main(String[] args) {// 类适配器ApplePhone classAdapter = new ClassAdapter();classAdapter.appleHeadset();classAdapter.appleCharger();System.out.println();// 对象适配器ApplePhone objectAdapter = new ObjectAdapter(new AndroidPhoneImpl());objectAdapter.appleHeadset();objectAdapter.appleCharger();System.out.println();// 默认适配器ApplePhone defaultAdapter = new DefaultAdapter();defaultAdapter.appleHeadset();defaultAdapter.appleCharger();}}----输出----[类适配器]使用了耳机适配器安卓耳机[类适配器]使用了充电器适配器安卓充电器[对象适配器]使用了耳机适配器安卓耳机[对象适配器]使用了耳机适配器安卓充电器[默认适配器]只适配了耳机
