一、什么是适配器模式(Adapter Pattern)
作为两个不兼容的接口之间的桥梁,适配器模式使得原本由于接口不兼容而不能一起工作的两个类可以一起工作。
适配器模式包括3种形式:
- 类适配器模式
想将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
- 对象适配器模式
想将一个对象转换成满足另一个新接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配器类的方法中,调用实例的方法就行。
- 接口适配器模式(或又称作缺省适配器模式)
不想实现一个接口中所有的方法时,可以创建一个Adapter,实现所有方法,在写别的类的时候,继承Adapter类即。
二、适配器的实现方式
模式结构(角色)分析:
- 源(Adaptee):需要被适配的对象或类型,相当于插头。
- 适配器(Adapter):连接目标和源的中间对象,相当于插头转换器。
- 目标(Target):期待得到的目标,相当于插座。
2.1类适配器模式
类关系图:
统一模型:
代码实现:
类的适配器
/*
*源类
* */
public class OrgAdaptee {
public void methodA(){
System.out.println("OrgAdaptee->methodA");
}
}
/*
* 目标模型
* */
public interface TargetModule {
void methodA();
void methodB();
void methodC();
}
/*
* 新老模型的适配器操作
* */
public class Adapter extends OrgAdaptee implements TargetModule {
@Override
public void methodB() {
System.out.println("TargetModule->methodB");
}
@Override
public void methodC() {
System.out.println("TargetModule->methodC");
}
}
测试用例:
/*
* 类的适配器模式
* */
@Test
public void getClsAdapter() {
Adapter adapter = new Adapter();
adapter.methodA();
adapter.methodB();
adapter.methodC();
}
测试结果:
OrgAdaptee->methodA
TargetModule->methodB
TargetModule->methodC
2.2对象适配器模式
类关系图:
统一模型:
代码实现:
对象适配器
/*
*源类
* */
public class OrgAdaptee {
public void methodA(){
System.out.println("OrgAdaptee->methodA");
}
}
/*
* 目标模型
* */
public interface TargetModule {
void methodA();
void methodB();
void methodC();
}
/*
* 新老模型的适配器操作 (对象的适配器)
* */
public class ObjectAdapter implements TargetModule {
/*
*源头
* */
OrgAdaptee orgAdaptee;
/*
* 构造函数
* */
public ObjectAdapter(OrgAdaptee orgAdaptee){
this.orgAdaptee=orgAdaptee;
}
@Override
public void methodA() {
orgAdaptee.methodA();
}
@Override
public void methodB() {
System.out.println("ObjectAdapter->methodB");
}
@Override
public void methodC() {
System.out.println("ObjectAdapter->methodC");
}
}
测试用例:
/*
* 对象适配器
* */
@Test
public void getObjAdapter() {
OrgAdaptee orgAdaptee = new OrgAdaptee();
ObjectAdapter adapter = new ObjectAdapter(orgAdaptee);
adapter.methodA();
adapter.methodB();
adapter.methodC();
}
测试结果:
OrgAdaptee->methodA
ObjectAdapter->methodB
ObjectAdapter->methodC
2.3接口适配器模式(缺省适配模式)
类关系图:
统一模型:
代码实现:
接口适配器
/*
* 支付的统一接口(源(Adapee)角色)接口适配器
* */
public interface PayGateWay {
void unifiedOrder();
void refund();
void query();
void sendRedPack();
}
/*
* 适配器 所有方法为空实现的操作
* */
public class PayGateWayAdapter implements PayGateWay{
@Override
public void unifiedOrder() {
}
@Override
public void refund() {
}
@Override
public void query() {
}
@Override
public void sendRedPack() {
}
}
/*
* 目标(Target)角色
* */
public class ProductVideoOrder extends PayGateWayAdapter {
@Override
public void unifiedOrder() {
System.out.println("ProductVideoOrder->unifiedOrder");
}
@Override
public void refund() {
System.out.println("ProductVideoOrder->refund");
}
}
/*
* 目标(Target)角色
* */
public class ProductVipOrder extends PayGateWayAdapter {
@Override
public void unifiedOrder() {
System.out.println("ProductVipOrder->unifiedOrder");
}
@Override
public void refund() {
System.out.println("ProductVipOrder->refund");
}
@Override
public void sendRedPack() {
System.out.println("ProductVipOrder->sendRedPack");
}
}
测试用例:
/*
* 接口适配器
* */
@Test
public void getApiAdapter() {
ProductVideoOrder productVideoOrder = new ProductVideoOrder();
productVideoOrder.refund();
productVideoOrder.unifiedOrder();
productVideoOrder.query();
productVideoOrder.sendRedPack();
}
测试结果:
ProductVideoOrder->refund
ProductVideoOrder->unifiedOrder
方法评估:
- 在使用一些旧系统或者是类库时,经常会出现接口不兼容的问题,适配器模式在解决这类问题具有优势。
- 学习设计模式一定不要局限代码层面,要从软件系统整体去考虑,而不是为了使用设计模式,而去使用设计模式。
优点:
- 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 增加灵活度,提高复用性,适配器类可以在多个系统使用,符合开闭原则。
缺点:
- 整体类的调用链路增加,本来A可以直接调用C,使用适配器后是A调用B,B再调用C。
标签:适配器,System,模式,public,println,Override,设计模式,void From: https://www.cnblogs.com/q994321263/p/16961848.html