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设计模式 —— 适配器模式的更多相关文章

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

    JAVA 设计模式 适配器模式 用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器 ...

  2. 【设计模式】Java设计模式 - 适配器模式

    [设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...

  3. JAVA 设计模式 适配器模式

    用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式是一种结构型模式. 结构

  4. Java设计模式 - 适配器模式

    概念: 将一个类的接口,转换成客户期望的另一个接口.适配器模式让原来接口不兼容的类可以在一起工作. 解决的问题: 提供类似于中间人的作用:把原本不兼容.不能一起工作的接口组合在一起,使得它们能够在一起 ...

  5. Java设计模式——适配器模式(Adapter)

    目的:把源类型适配为目标类型,以适应客户端(Client)的需求:此处我们把目标接口的调用方视为客户端 使用场景:需要对类型进行由源类型到目标类型转换的场景中 前置条件:已有客户端 //Client ...

  6. java设计模式——适配器模式 Java源代码

    前言:适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口,从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作.通常被用在一个项目需要引用一些开源框架来一起工作时,这些框架的内部都有一 ...

  7. Java设计模式の适配器模式

    定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极 ...

  8. Java设计模式-适配器模式(Adapter)

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...

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

    适配器模式的个人理解: 首先有一个目标角色.一个源角色还有一个适配器角色.我们要做的就是利用适配器角色将源角色转换为目标角色.而目标角色是一个正在良好运行的一个角色. 转换方法: (1)  适配器类继 ...

  10. Java设计模式06:常用设计模式之适配器模式(结构型模式)

    1. Java之适配器模式(Adapter Pattern) (1)概述:    将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类,可以在一起 ...

随机推荐

  1. 尝试改善科研V2

    参考链接: https://fulequn.github.io/2022/09/26/Article202209261/ https://www.xljsci.com/ https://apps.an ...

  2. HashMap长度为什么是2的幂

    虽然hash值很多,范围很大,但是内存存不了那么大的数组,所以取hash的散列值的时候,需要用hash值,除以数组长度取余数.又由于取余数(%)的性能不如与运算(&),所以想用与运算来代替取余 ...

  3. Vuex----Getters

    Getter 用于对 Store中的数据进行加工处理形成新的数据. Getter 不会修改 Store 中的原数据,它只起到一个包装器的作用,将Store中的数据加工后输出出来. const stor ...

  4. 《Linux就该这么学》这本书写得真好,我很喜欢。

    本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...

  5. Oracle联机备份与恢复

    联机备份又称为热备份,在数据库运行的情况下对数据库进行物理备份.进行联机备份,数据库必须运行在归档日志(ARCHIVELOG)模式下. 联机完全备份步骤: 1.设置归档日志模式,创建恢复目录用的表空间 ...

  6. 汇编程序 - TD调试

    为了写这个Blog,无奈的我深夜打开虚拟机,希望也能帮助一些人,因为好像真的有人不会欸!(→_→) 写在前面的话: 1. TD面板下的调试十分重要.可以观察内存(GOTO DS:XXXX)存放的位置与 ...

  7. 盒子模型和CSS背景和列表

    盒子模型(1)宽度-width:长度值 | 百分比 | auto-max-width:长度值 | 百分比 | auto-min-width:长度值 | 百分比 | auto(2)高度-height:长 ...

  8. Java使用Redis实现分布式锁

    1.概述 此处使用Redis的setNx命令和expire命令和del命令来实现分布式锁. 首先我们要知道, 我们的redis执行命令是队列方式的,并不存在多个命令同时运行,所有命令都是串行的访问.那 ...

  9. FLINK集群搭建

    常用命令总结 启动/停止 flink 集群 ./bin/start-cluster.sh./bin/stop-cluster.sh 启动或停止JOBMANAGER bin/jobmanager.sh ...

  10. C/C++ 数据结构使用数组实现队列的基本操作

    //使用数组实现队列 #include <iostream> #include <Windows.h> using namespace std; #define MAXSIZE ...