Java设计模式 —— 适配器模式

2023-05-18,,

9 适配器模式

9.1 结构型模式

结构型模式(Structural Pattern) 关注如何将现有类或对象组织在一起形成更强大的结构。结构型模式根据描述目标不同可以分为两种:

类结构型模式:关心类的组合,由多个类组成,一般只存在继承和实现关系
对象结构型模式:关心类与对象的组合,通过关联关系在一个类中定义另一个类的实例对象,然后调用其方法

根据合成复用原则,应该尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式

9.2 适配器模式概述

Adapter Pattern: 将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。

适配器模式既可以作为类适配器模式,也可以作为对象适配器模式。

类适配器模式结构图如下所示:

对象适配器模式结构图如下所示:

9.3 类适配器模式实现

9.3.1 目标抽象类

public interface Target {
public void request();
}

9.3.2 适配者类

public class Adaptee {
public void specificRequest() {
// 业务代码
}
}

9.3.3 适配器类

public class Adapter extends Adaptee implements Target {
public void request() {
super.specificRequest();
}
}

9.3.4 客户端调用类

public class Client {
public static void main(String[] args) {
// 通过适配器类调度被适配类的方法
Target t = new Adapter();
t.request();
}
}

9.4 对象适配器模式实现

9.4.1 目标抽象类

public abstract class Target {
public void method() {
System.out.println("Father Method.");
} // 抽象方法,待适配器类实现
public void request();
}

9.4.2 适配者类

public class Adaptee {
public void specificRequest() {
// 业务代码
}
}

9.4.3 适配器类

public class Adapter extends Target {
// 定义适配者对象
private Adaptee adaptee; // 通过构造方法实例化适配者对象
public Adapter() {
adaptee = new Adaptee();
}
public void request() {
adaptee.specificRequest();
}
}

9.4.4 客户端调用类

public class Client {
public static void main(String[] args) {
Target t = new Adapter();
t.method(); // 通过成员变量调用适配者对象的方法
t.request();
}
}

9.5 缺省适配器模式

Default Adapter Pattern: 当不需要实现一个接口提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中的每个方法提供一个默认空实现,那么该抽象类的子类就可以选择性覆盖父类中的方法。

缺省适配吗模式结构图如下所示:

9.6 双向适配器

在对象适配器的使用过程中,如果适配器类同时包含目标类和适配者类的引用,适配者类可以通过它调用目标i类的方法,目标类也可以通过它调用适配者类的方法,那么该适配器就是一个双向适配器

双向适配器的结构图如下所示:

9.7 适配器模式的优/缺点

适配器模式的优点主要如下:

将目标类和适配者类解耦,通过引入一个新的适配器类来重用现有的适配者类
将具体业务实现封装在适配者类中,增加类的透明性和复用性
增加/删除 适配器类无须修改原有代码,符合开闭原则
对象适配器可以适配多个适配者类,通过关联实现

类适配器模式的缺点主要如下:

该模式通过继承实现,Java不支持多重继承,因此类适配器模式只能适配一个类

对象适配器模式的缺点主要如下:

该模式下置换适配者类的方法比较麻烦,既需要修改适配者类,也需要修改适配器类

Java设计模式 —— 适配器模式的相关教程结束。

《Java设计模式 —— 适配器模式.doc》

下载本文的Word格式文档,以方便收藏与打印。