前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【设计模式】适配器模式 ( 类适配器代码模板 | 对象适配器代码模板 | 适配器模式示例 )

【设计模式】适配器模式 ( 类适配器代码模板 | 对象适配器代码模板 | 适配器模式示例 )

作者头像
韩曙亮
发布于 2023-03-27 11:22:06
发布于 2023-03-27 11:22:06
45800
代码可运行
举报
运行总次数:0
代码可运行

文章目录

I . 适配器模式 ( 类适配器 ) 代码模板

1 . 明确被适配者 : 被适配者 是一个现有类 , 该类保持不变 ;

① 现有类 : 实际开发时, 该类并不需要定义 , 这里给出示例 ;

② 调用行为 : 最终的用户目标接口 , 是要调用 Adaptee 类对象的 adapteeFunction 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.classadapter;

/**
 * 被适配者 : 现有的功能类
 * 提供实际的功能, 及实现相关操作
 *
 * 这是被调用的现有类 , 但是不能使用 adapteeRequest 方法
 * 要使用用户 TargetInterface 接口的 request 方法
 */
public class Adaptee {
    public void adapteeFunction(){
        System.out.println("类适配器测试 : 被适配者方法");
    }
}

2 . 定义用户目标接口 : 用户通过调用该接口 , 实现实际的功能 , 该功能与适配者中的功能类似 , 但 接口不同 ;

① 用户调用 : 最终用户调用方法时 , 会创建 TargetInterface 接口子类类对象 , 并调用其中的 userCall 方法 ;

② 实现途径 : 在一个第三方类中 , 实现该 TargetInterface 接口 , 重写 userCall 方法 , 在该方法中调用 Adaptee 的 adapteeFunction 方法 ; ( 这个第三方类 , 就是适配器 )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.classadapter;

/**
 * 目标接口
 * 用户调用的是该接口的 userCall 方法
 *
 * 注意 : 适配器需要实现目标接口
 */
public interface TargetInterface {
    //用户调用的方法
    void userCall();
}

3 . 声明适配器 ( 类适配器 ) :

① 适配器 实现 用户目标接口 : 适配器 需要实现 用户目标接口 , 在实现的接口方法中 , 需要将实际操作 委托给 被适配者 ;

② 适配器 实现 用户目标接口 代码实现说明 :此处 Adapter 适配器类 , 实现了 TargetInterface 接口 , 并实现了 userCall 方法 , 目的是为了让用户有可调用的接口 ;

③ 适配器 继承 被适配者 : 如何调用到 被适配者 的方法呢 , 这里 适配器 通过 继承 被适配者 , 获取调用 被适配者 方法的资格 ;

④ 适配器 继承 被适配者 代码实现说明 :Adapter 适配器继承了 Adaptee 被适配者 , 目的是为了获取调用 Adaptee 父类的 adapteeFunction 方法 ;

⑤ 委托操作 : 在实现的 用户目标接口中 , 通过 super 关键字 , 调用 被适配者 的方法实现具体功能 ;

⑥ 委托操作代码实现说明 : 在 TargetInterface 接口的 userCall 方法中 , 调用 Adaptee 父类的 adapteeFunction 方法 , 这样就可以在不用修改代码的情况下 , 让用户可以通过创建 TargetInterface 接口对象 , 调用 userCall 方法 , 从而间接调用到 Adaptee 类的 adapteeFunction 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.classadapter;

/**
 * 适配器类
 *
 * 适配器类 继承了 被适配者 类, 目的是为了访问其 adapteeFunction 函数
 * 同时其实现了 TargetInterface 接口 , 在 重写的 userCall 方法中 ,
 * 调用 Adaptee 父类的 adapteeFunction 方法 , 将实际的操作委托给了父类方法
 */
public class Adapter extends Adaptee implements TargetInterface {
    @Override
    public void userCall() {
        //将父类 Adaptee 的 request 方法适配给了 TargetInterface 接口
        super.adapteeFunction();
    }
}

类适配器对象适配器 , 本质区别就是 适配器类访问 被适配者的途径 ; 类适配器 : 通过继承 被适配器 , 获取访问被适配器方法的资格 ; 对象适配器 : 通过在其内部维护一个 被适配者 成员变量 , 进而通过该成员变量访问 被适配者方法 ;

4 . 用户访问操作 :

① 定义目标接口变量 : 定义 用户目标接口 对象变量 ; 用户定义 TargetInterface 类型变量 , 为其赋值适配器对象 Adapter 类对象作为其变量值 ;

② 目标接口变量赋值 : 创建 适配器对象 赋值给上述 用户目标接口对象变量 , ( 适配器 是 用户目标接口 的子类 ) ;

③ 目标接口调用 : 调用用户目标接口 , 即可调用被适配者的实际功能方法 ; 用户直接调用 TargetInterface 接口的 userCall 方法 , 实际上被适配器委托给了 Adaptee 的 adapteeFunction 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.classadapter;

public class Main {
    public static void main(String[] args) {
        //用户创建的类时 目标接口 类型对象
        //但创建对象时 , 创建的是适配器对象
        //适配器对象 实现了 TargetInterface 接口 , Adapter 是 TargetInterface 子类
        //适配器中重写的 userCall 方法实际上委托给了 Adaptee 被适配者对象 成员
        TargetInterface targetInterface = new Adapter();
        targetInterface.userCall();
    }
}

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
类适配器测试 : 被适配者方法
II . 适配器模式 ( 对象适配器 ) 代码模板

1 . 明确被适配者 : 被适配者 是一个现有类 , 该类保持不变 ;

① 现有类 : 实际开发时, 该类并不需要定义 , 这里给出示例 ;

② 调用行为 : 最终的用户目标接口 , 是要调用 Adaptee 类对象的 adapteeFunction 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.objectdapter;

/**
 * 被适配者 : 现有的功能类
 * 提供实际的功能, 及实现相关操作
 *
 * 这是被调用的现有类 , 但是不能使用 adapteeRequest 方法
 * 要使用用户 TargetInterface 接口的 request 方法
 */
public class Adaptee {
    public void adapteeFunction(){
        System.out.println("对象适配器测试 : 被适配者方法");
    }
}

2 . 定义用户目标接口 : 用户通过调用该接口 , 实现实际的功能 , 该功能与适配者中的功能类似 , 但 接口不同 ;

① 用户调用 : 最终用户调用方法时 , 会创建 TargetInterface 接口子类类对象 , 并调用其中的 userCall 方法 ;

② 实现途径 : 在一个第三方类中 , 实现该 TargetInterface 接口 , 重写 userCall 方法 , 在该方法中调用 Adaptee 的 adapteeFunction 方法 ; ( 这个第三方类 , 就是适配器 )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.objectdapter;

/**
 * 目标接口
 * 用户调用的是该接口的 userCall 方法
 *
 * 注意 : 适配器需要实现目标接口
 */
public interface TargetInterface {
    //用户调用的方法
    void userCall();
}

3 . 声明适配器 ( 类适配器 ) :

① 适配器 实现 用户目标接口 : 适配器 需要实现 用户目标接口 , 在实现的接口方法中 , 需要将实际操作 委托给 被适配者 ;

② 适配器 实现 用户目标接口 代码实现说明 :此处 Adapter 适配器类 , 实现了 TargetInterface 接口 , 并实现了 userCall 方法 , 目的是为了让用户有可调用的接口 ;

③ 适配器 维护 被适配者 类型成员变量 : 如何调用到 被适配者 的方法呢 , 这里 适配器 通过 定义 被适配者 类型的成员变量 , 通过该 被适配者 类型成员变量 , 调用 被适配者 public 方法 ;

④ 适配器 维护 被适配者 类型成员变量 代码实现说明 :Adapter 适配器中定义了一个 Adaptee 被适配者成员变量 , 目的是为了通过该成员变量 , 调用 Adaptee 的 adapteeFunction 方法 ;

⑤ 委托操作 : 在实现的 用户目标接口中 , 通过 super 关键字 , 调用 被适配者 的方法实现具体功能 ;

⑥ 委托操作代码实现说明 : 在 TargetInterface 接口的 userCall 方法中 , 调用 Adaptee 父类的 adapteeFunction 方法 , 这样就可以在不用修改代码的情况下 , 让用户可以通过创建 TargetInterface 接口对象 , 调用 userCall 方法 , 从而间接调用到 Adaptee 类的 adapteeFunction 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.objectdapter;

/**
 * 适配器类
 *
 * 适配器类 维护了一个 被适配者的对象 Adaptee 成员变量
 * 同时又实现了目标接口 TargetInterface
 * 当用户调用 TargetInterface 接口的 userCall 方法时
 * 将实际的操作委托给 Adaptee 接口的 adapteeFunction 方法
 */
public class Adapter implements TargetInterface {

    //通过维护成员变量的方式 , 将 TargetInterface 接口的 request 方法
    // 委托给 Adaptee 接口的 adapteeRequest 方法
    private Adaptee adaptee = new Adaptee();

    @Override
    public void userCall() {
        //将父类 Adaptee 的 request 方法适配给了 TargetInterface 接口
        adaptee.adapteeFunction();
    }
}

类适配器对象适配器 , 本质区别就是 适配器类访问 被适配者的途径 ; 类适配器 : 通过继承 被适配器 , 获取访问被适配器方法的资格 ; 对象适配器 : 通过在其内部维护一个 被适配者 成员变量 , 进而通过该成员变量访问 被适配者方法 ;

4 . 用户访问操作 :

① 定义目标接口变量 : 定义 用户目标接口 对象变量 ; 用户定义 TargetInterface 类型变量 , 为其赋值适配器对象 Adapter 类对象作为其变量值 ;

② 目标接口变量赋值 : 创建 适配器对象 赋值给上述 用户目标接口对象变量 , ( 适配器 是 用户目标接口 的子类 ) ;

③ 目标接口调用 : 调用用户目标接口 , 即可调用被适配者的实际功能方法 ; 用户直接调用 TargetInterface 接口的 userCall 方法 , 实际上被适配器委托给了 Adaptee 的 adapteeFunction 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.objectdapter;

public class Main {
    public static void main(String[] args) {
        //用户创建的类时 目标接口 类型对象
        //但创建对象时 , 创建的是适配器对象
        //适配器对象 实现了 TargetInterface 接口 , Adapter 是 Target 子类
        //适配器中重写的 userCall 方法实际上委托给了 Adaptee 被适配者对象 成员
        TargetInterface target = new Adapter();
        target.userCall();
    }
}

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
对象适配器测试 : 被适配者方法
III . 适配器模式 代码示例

1 . 需求描述 : 家庭中的插座提供 220 V 电压 , 手机需要使用 5V 电压进行充电 ;

2 . 适配器模式建模 :

① 被适配者 : 家庭中提供的 220 V 电压 ;

② 用户调用接口 : 手机使用 5 V 电压充电 ;

③ 适配器 : 将家庭的 220 V 电压转为手机充电的 5 V 电压 ;

3 . 被适配者 : 家庭电压 220 V ; HomePower220V 类提供原本的功能 ; 最终用户的目标接口调用的是该类的 power220V 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.demo;

/**
 * 被适配者
 * 代表 220V 电压
 */
public class HomePower220V {
    public int power220V(){
        System.out.println("输出 220V 电压");
        return 220;
    }
}

4 . 用户接口 : 手机使用 5 V 电压充电 , 最终使用的电压是 5V ; 调用 HomePower220V 的 power220V 方法 , 接口不同 , 需要使用适配器转换 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.demo;

/**
 * 目标接口 : 手机充电器
 * 输出 5V 电压
 */
public interface PhoneCharge {
    int power5V();
}

5 . 适配器 : 将家庭的 220 V 输出电压 , 转为输出 5 V 电压 ;

① 实现接口 : 适配器 Adapter 实现 PhoneCharge 接口 , 实现 power5V 方法 ;

② 维护成员变量 : 在适配器中维护 HomePower220V 成员变量 , 在 power5V 方法中调用 HomePower220V 类的 power220V 方法 ;

③ 目的 : 达到了适配 被适配者 HomePower220V 和 用户目标接口 PhoneCharge 的接口适配 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.demo;

/**
 * 适配器
 * 输入 220V 电压, 输出 5V 电压
 */
public class Adapter implements PhoneCharge {
    private HomePower220V ac220V = new HomePower220V();
    @Override
    public int power5V() {
        int input = ac220V.power220V();
        //将 220 V 处理成 5V
        System.out.println("220V 转为 5V 电压");
        return 5;
    }
}

6 . 用户接口调用 :

① 用户行为 : 用户方创建 PhoneCharge 接口对象 , 将适配器对象赋值给该 PhoneCharge 接口变量 , 调用时调用 PhoneCharge 接口的 power5V 方法 ,

② 委托操作 : 适配器中实现的 power5V 方法 , 实际被委托给了 HomePower220V 被适配者的 power220V 方法 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package kim.hsl.design.adapter.demo;

public class Main {
    public static void main(String[] args) {
        PhoneCharge phoneCharge = new Adapter();
        phoneCharge.power5V();
    }
}

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输出 220V 电压
220V 转为 5V 电压
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式之适配器模式
结构型模式之适配器模式 定义 适配器模式用于将一个接口转化成客户想要的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结
爱撒谎的男孩
2018/05/25
4990
设计模式---适配器模式
1、不同国家的插座是有区别的,如果我们去国外旅游,需要带上国外的插头转换器,来能兼容国外的插座;
大忽悠爱学习
2021/11/15
7680
设计模式-适配器模式(类适配器、对象适配器、接口适配器详解)
适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。也称包装器(Wrapper),属于结构型模式。适配器模式主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
唔仄lo咚锵
2022/05/08
2.8K0
设计模式-适配器模式(类适配器、对象适配器、接口适配器详解)
设计模式 | 适配器模式及典型应用
适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
小旋锋
2019/01/21
1.7K0
设计模式(六):适配器模式
设计模式(六):适配器模式
Java架构师必看
2021/05/14
2590
设计模式——适配器模式
设计模式——适配器模式
Java架构师必看
2021/05/14
4750
设计模式——适配器模式
05-01-设计模式 适配器模式
泰国插座用的是两孔的(欧标), 我们国内的是矩形的, 没办法使用, 这个时候就可以买一个电源转换器(适配器) 就可以了
彼岸舞
2022/05/28
1930
05-01-设计模式 适配器模式
适配器模式(Adapter Pattern)- 最易懂的设计模式解析
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
Carson.Ho
2019/02/22
3.1K0
设计模式实战-适配器模式,承上启下
适配器,其实很好理解,生活中也随处可见,比如电源适配器、usb 适配器等等,那么适配器模式,也被称为Wrapper 模式。
架构师修炼
2020/07/20
5000
设计模式实战-适配器模式,承上启下
Carson带你学设计模式:适配器模式(Adapter Pattern)
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
Carson.Ho
2022/03/25
2280
Carson带你学设计模式:适配器模式(Adapter Pattern)
适配器模式
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
许喜朝
2022/05/05
3840
图解Java设计模式之适配器模式
泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了。
海仔
2020/03/18
4500
图解Java设计模式之适配器模式
Java设计模式之适配器模式
假设你国外度假,去的是德国,工匠精神的大国。出国之前你要准备随身必备用品,衣服,手机电脑,充电器......然而在充电器上德国使用的是欧标(也就是两孔插座)你需要自己准备一个转换器,才可以使用其插座进行充电。这个转换器也就是咱们所要讲的适配器
@派大星
2023/06/28
2440
Java设计模式之适配器模式
java设计模式之适配器模式,大丈夫能屈能伸
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式有三种:类适配器、对象适配器、接口适配器
用户4361942
2019/05/24
6550
适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。——《设计模式:可复用面向对象软件的基础》
mingmingcome
2021/11/29
6040
适配器模式
Java描述设计模式(07):适配器模式
缺省(接口)适配(Default Adapter)模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。
知了一笑
2019/08/16
3450
Java描述设计模式(07):适配器模式
适配器模式(Adapter)
定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。
happlyfox
2018/10/31
6690
23设计模式之 ---------适配器模式
适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
默 语
2024/11/20
1050
23设计模式之 ---------适配器模式
设计模式02——Adapter模式
适配器设计模式,顾名思义就是将适配器的作用总结抽象成为一种代码的组织方式,将现有的代码通过适配器进行适配,以满足项目对另外一个类或者接口的要求。换句话说就是将一个类的接口适配(包装/转换)成客户(调用者)希望的另一个接口。适配器设计模式有以下两种形式:
itlemon
2020/04/03
5240
设计模式02——Adapter模式
工作中常用的设计模式--适配器模式
已存在的接口、服务,跟我们所需、目的接口不兼容时,我们需要通过一定的方法将二者进行兼容适配。一个常见的例子,家用电源(国标)220V,而手机标准输入一般为5V,此时我们便需要一个适配器来将220V转换为5V使用。
lpe234
2022/11/30
2320
相关推荐
设计模式之适配器模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档