适配器模式:将一个类的接口,转换成客户期望的另一个接口,让不兼容的接口变成兼容。
1.类适配器模式:通过多重继承来实现适配器功能。多重继承就是先继承要转换的实现类,再实现被转换的接口。
2.对象适配器模式:通过组合来实现适配器。
什么是适配器模式?或者说适配器模式有什么作用呢?上面已经定义的很清楚了。下面我们再用一张草图来更形象的描述这一设计模式。
这确实是一张草图,图中1就好比我们的普通耳机接口,3就好比苹果手机接口,2就好比耳机转接头,只有这样苹果手机才能使用普通耳机,模块2就相当于一个适配器。
对于我们程序中的代码来说,1是我们自己系统的接口,3是其他厂家的系统接口,2就是我们为了对接这两个系统加的适配器。这样就不至于修改1,3部分的代码。
适配器工作看起来就像一个中间人,那么让我们来看看具体JAVA代码的表述:
耳机3.5mm接口:
/** * 耳机 : 3.5mm接口 * @author monkjavaer * @date 2018/08/29 21:32 */ public interface Is35mmEarPhone { /** * 这是3.5mm接口耳机 */ void is35mmEarPhone(); }
type-C接口:
/** * type-C接口 * @author monkjavaer * @date 2018/08/29 21:29 */ public interface TypeC { /** * type-C接口 */ void isTypeC(); }
华为某款手机类实现type-c接口:
/** * 手机Type-c接口 * @author monkjavaer * @date 2018/08/29 21:45 */ public class PhoneTpyeC implements TypeC { @Override public void isTypeC() { System.out.println("我是手机Type-C接口"); } }
那么问题来了,怎么让只有type-c接口的华为手机能使用3.5mm接口的耳机呢?当然是适配器模式了。
类适配器模式:
/** * 耳机3.5mm接口转换为Type-C接口的适配器 * * 类适配器模式:通过多重继承来实现适配器功能。多重继承就是先继承要转换的实现类,再实现被转换的接口。 * @author monkjavaer * @date 2018/08/29 21:47 */ public class ClassAdapter extends PhoneTpyeC implements Is35mmEarPhone { @Override public void is35mmEarPhone() { isTypeC(); } }
test:
/** * 通过适配器将3.5mm接口转换为type-c接口 * @author monkjavaer * @date 2018/08/29 22:11 */ public class ClassAdapterTest { public static void main(String[] args) { Is35mmEarPhone is35mmEarPhone = new ClassAdapter(); is35mmEarPhone.is35mmEarPhone(); } }
输出:我是手机Type-C接口.
对象适配器模式:
/** * 耳机3.5mm接口转换为Type-C接口的适配器 * * 对象适配器模式:通过组合来实现适配器 * @author monkjavaer * @date 2018/08/29 22:14 */ public class ObjectAdapter implements Is35mmEarPhone{ TypeC typeC; public ObjectAdapter(TypeC typeC) { this.typeC = typeC; } @Override public void is35mmEarPhone() { typeC.isTypeC(); } }
test:
/** * 通过适配器将3.5mm接口转换为type-c接口 * @author monkjavaer * @date 2018/08/29 22:19 */ public class ObjectAdapterTest { public static void main(String[] args) { Is35mmEarPhone is35mmEarPhone = new ObjectAdapter(new PhoneTpyeC()); is35mmEarPhone.is35mmEarPhone(); } }
输出:我是手机Type-C接口