适配器模式(Adapter Pattern)
-
见名知意,是作为两个不兼容的接口之间的桥梁,属于结构型模式
-
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
-
常见的几类适配器
-
类的适配器模式
-
想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
-
-
对象的适配器模式
- 想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行
-
接口的适配器模式
- 不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即
-
JDBC给出一个客户端通用的抽象接口,每一个具体数据库厂商 如 SQL Server、Oracle、MySQL等,就会开发JDBC驱动,就是一个介于JDBC接口和数据库引擎接口之间的适配器软件
一、接口的适配器模式-代码如下
//全部方法的接口
public interface PayGateway {
/**
* 下单
*/
void unifiedorder();
/**
* 退款
*/
void refund();
/**
* 查询
*/
void query();
/**
* 优惠卷
*/
void sendRedPack();
}
//适配器,实现接口全部方法
public class PayGatewayAdpater implements PayGateway{
@Override
public void unifiedorder() {
}
@Override
public void refund() {
}
@Override
public void query() {
}
@Override
public void sendRedPack() {
}
}
//订单支付模块
public class ProductVideoOrder extends PayGatewayAdpater{
@Override
public void unifiedorder() {
System.out.println("订单模块创建对象成功");
}
//退款方法
@Override
public void refund() {
System.out.println("订单模块-退款");
}
}
//充值vip模块
public class ProductVipOrder extends PayGatewayAdpater{
@Override
public void unifiedorder() {
System.out.println("充值vip模块创建对象成功");
}
//退款方法
@Override
public void refund() {
System.out.println("充值vip模块-退款"); }
//优惠卷方法
@Override
public void sendRedPack() {
System.out.println("充值vip模块-优惠卷");
}
}
运行效果如下
二、类的适配器模式
- 想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
代码如下
/**
* 老的类有一个方法
*/
public class OldModule {
public void methodA(){
System.out.println("methodA");
}
}
/**
* 新的类,增加了两个方法
*/
public interface TargetModule {
/**
* 和需要适配的类方法名一样
*/
void methodA();
/**
* 新的方法,如果有多个新的方法直接编写就行
*/
void methodB();
void methodC();
}
public class Adapter extends OldModule implements TargetModule{
/**
* 新的方法
*/
@Override
public void methodB() {
System.out.println("Adapter methodB");
}
@Override
public void methodC() {
System.out.println("Adapter methodC");
}
}
运行效果
总结
-
在使用一些旧系统或者是类库时,经常会出现接口不兼容的问题,适配器模式在解决这类问题具有优势
-
学习设计模式一定不要局限代码层面,要从软件系统整体去考虑,而不是为了使用设计模式,而去使用设计模式
-
优点
- 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
- 增加灵活度, 提高复用性,适配器类可以在多个系统使用,符合开闭原则
-
缺点
- 整体类的调用链路增加,本来A可以直接调用C,使用适配器后 是A调用B,B再调用C