1.适配器模式
- 适配器模式(Adapter Pattern)
- 见名知意,是作为两个不兼容的接口之间的桥梁,属于结构型模式
- 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
- 常见的几类适配器
- 类的适配器模式
- 想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
- 对象的适配器模式
- 想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行
- 接口的适配器模式
- 不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即可
- 类的适配器模式
- 应用场景
- 电脑需要读取内存卡的数据,读卡器就是适配器
- 日常使用的转接头,如电源转换头、电压转换头
- JDK中InputStreamReader就是适配器
- JDBC就是我们用的最多的适配器模式
- JDBC给出一个客户端通用的抽象接口,每一个具体数据库厂商,如SQL Server、Oracle、MySQL等,就会开发JDBC驱动,就是一个介于JDBC接口和数据库引擎接口之间的适配器软件
- 优点
- 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
- 增加灵活度,提高复用性,适配器类可以在多个系统使用,符合开闭原则
- 缺点
- 整体类的调用链接增加,本来A可以直接调用C,使用适配器后A调用B,B再调用C
2.接口适配器
-
接口适配器
- 有些接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要实现部分接口就可以了
-
代码示例
java/** * 支付接口 */ interface Pay { /** * 下单 */ void unifiedOrder(); /** * 退款 */ void refund(); } /** * 适配器 */ class PayAdapter implements Pay { @Override public void unifiedOrder() { System.out.println("适配器 下单"); } @Override public void refund() { System.out.println("适配器 退款"); } } class OnlyRefund extends PayAdapter { @Override public void refund() { System.out.println("OnlyRefund---退款"); } } public class Main { public static void main(String[] args) { OnlyRefund onlyRefund = new OnlyRefund(); onlyRefund.refund(); onlyRefund.unifiedOrder(); } }
3.类的适配器
-
类的适配器模式
-
想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
-
-
代码示例
java/** * 老的原始类 */ class OldModule { public void methodA() { System.out.println("原始类 methodA"); } } /** * 新的目标接口 */ interface TargetModule { /** * 需要和适配的类方法名一样 */ void methodA(); /** * 新的方法 */ void methodB(); } /** * 适配器 */ class Adapter extends OldModule implements TargetModule { @Override public void methodB() { System.out.println("适配器 methodB"); } } public class Main { public static void main(String[] args) { Adapter adapter = new Adapter(); adapter.methodA(); adapter.methodB(); } }