适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式分为 类 结 构 型 模 式 \color{orange}{类结构型模式} 类结构型模式和 对 象 结 构 型 模 式 \color{orange}{对象结构型模式} 对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
两者均实现目标角色接口,目标接口和适配者类的代码也可以相同,区别是:
类适配器模式:适配器类继承适配者类,是继承关系。
对象适配器模式:适配器类持有适配者类对象的引用,是组合或聚合关系。
适配器模式的优点:
1、客户端通过适配器可以透明地调用目标接口。
2、复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
3、将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
适配器模式的缺点:
对类适配器来说,更换适配器的实现过程比较复杂。
适配器模式包含以下主要角色:
1、目标(Target)接口角色:当前系统业务所期待的接口,它可以是抽象类或接口。
2、适配者(Adaptee)类,也称源角色:它是被访问和适配的现存组件库中的组件类或接口。
3、适配器(Adapter)类角色:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
1、以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
2、使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
适配器模式可扩展为双向适配器模式,双向适配器类既可以把适配者接口转换成目标接口,也可以把目标接口转换成适配者接口。
说明:
对象适配器模式中的“目标接口”和“适配者类”的代码可以同类适配器模式一样,只要修改适配器类和客户端的代码即可。
目标角色ITarget:
package com.example.designpattern.classadapter;
/**
* @author Administrator
* @date 2020/7/27
* 目标角色:期待的接口
*/
interface ITarget {
public void a();
public void b();
}
源角色Adaptee:
package com.example.designpattern.classadapter;
/**
* @author Administrator
* @date 2020/7/27
* 源角色:需要适配的类
*/
class Adaptee {
public void a() {
System.out.println("adaptee: a()实现");
}
}
适配器角色Adapter:
package com.example.designpattern.classadapter;
/**
* @author Administrator
* @date 2020/7/27
* 适配器角色:把源角色转换为目标接口、核心类
*
* 将需要适配的Adaptee适配为ITarget目标类型
*/
class Adapter extends Adaptee implements ITarget {
@Override
public void b() {
System.out.println("adapter: b()实现");
}
}
调用:
package com.example.designpattern.classadapter;
/**
* @author Administrator
* @date 2020/7/27
*/
class Client {
public static void main(String[] args) {
ITarget iTarget = new Adapter();
iTarget.a();
iTarget.b();
}
}
目标角色ITarget:
package com.example.designpattern.objectadapter;
/**
* @author Administrator
* @date 2020/7/27
* 目标角色:客户端期待使用的类或接口
*/
interface ITarget {
public void a();
public void b();
}
源角色AbstractAdaptee:
package com.example.designpattern.objectadapter;
/**
* @author Administrator
* @date 2020/7/27
* 源角色:需要适配的类
*/
abstract class AbstractAdaptee {
public abstract void a();
}
源角色AbstractAdaptee的子类Adaptee1:
package com.example.designpattern.objectadapter;
/**
* @author Administrator
* @date 2020/7/27
* 源角色AbsAdaptee的子类
*/
class Adaptee1 extends AbstractAdaptee {
@Override
public void a() {
System.out.println("Adaptee1: a()实现");
}
}
Adaptee1的子类Adaptee1Sub:
package com.example.designpattern.objectadapter;
/**
* @author Administrator
* @date 2020/7/27
*/
class Adaptee1Sub extends Adaptee1 {
@Override
public void a() {
System.out.println("Adaptee1Sub: a()实现");
}
}
源角色AbstractAdaptee的子类Adaptee2:
package com.example.designpattern.objectadapter;
/**
* @author Administrator
* @date 2020/7/27
* 源角色AbstractAdaptee的子类
*/
class Adaptee2 extends AbstractAdaptee {
@Override
public void a() {
System.out.println("Adaptee2: a()实现");
}
}
适配器角色:
package com.example.designpattern.objectadapter;
/**
* @author Administrator
* @date 2020/7/27
* 适配器角色:把源角色转换为目标接口、核心类
*
* 需要AbsAdaptee及其所有子类
*/
class Adapter implements ITarget {
/**
* 源角色的对象引用
*/
private AbstractAdaptee abstractAdaptee;
public Adapter(AbstractAdaptee abstractAdaptee) {
this.abstractAdaptee = abstractAdaptee;
}
@Override
public void a() {
abstractAdaptee.a();
}
@Override
public void b() {
System.out.println("Adapter: b()实现");
}
}
调用:
package com.example.designpattern.objectadapter;
/**
* @author Administrator
* @date 2020/7/27
*/
class Client {
public static void main(String[] args) {
ITarget iTarget = new Adapter(new Adaptee1());
iTarget.a();
iTarget.b();
System.out.println();
ITarget iTarget2 = new Adapter(new Adaptee2());
iTarget2.a();
iTarget2.b();
System.out.println();
ITarget iTarget3 = new Adapter(new Adaptee1Sub());
iTarget3.a();
iTarget3.b();
}
}