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

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

文章目录

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

II . 适配器模式 ( 对象适配器 ) 代码模板

III . 适配器模式 代码示例



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


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



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


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



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 方法 ; ( 这个第三方类 , 就是适配器 )



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 方法 ;



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 方法 ;


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();
    }
}


执行结果 :


类适配器测试 : 被适配者方法




II . 适配器模式 ( 对象适配器 ) 代码模板


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



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


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



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 方法 ; ( 这个第三方类 , 就是适配器 )



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 方法 ;



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 方法 ;



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();
    }
}


执行结果 :


对象适配器测试 : 被适配者方法




III . 适配器模式 代码示例


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



2 . 适配器模式建模 :



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


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


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



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


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 方法 , 接口不同 , 需要使用适配器转换 ;


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 的接口适配 ;


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 方法 ;


package kim.hsl.design.adapter.demo;
public class Main {
    public static void main(String[] args) {
        PhoneCharge phoneCharge = new Adapter();
        phoneCharge.power5V();
    }
}




执行结果 :


输出 220V 电压
220V 转为 5V 电压


目录
相关文章
|
10天前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
100 0
|
11月前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
549 11
|
8月前
|
设计模式 存储 Java
【再谈设计模式】备忘录模式~对象状态的守护者
备忘录模式属于行为型设计模式。它的主要目的是在不破坏对象封装性的前提下,捕获并外部化一个对象的内部状态,以便之后可以将该对象恢复到这个状态。原发器(Originator):创建一个备忘录,用于记录当前时刻它的内部状态。原发器还可以使用备忘录来恢复其内部状态。备忘录(Memento):存储原发器对象的内部状态。备忘录应该防止原发器以外的其他对象访问其内部状态。负责人(Caretaker):负责保存备忘录,但不能对备忘录的内容进行操作或检查。
289 82
|
6月前
|
设计模式 前端开发 Java
【设计模式】【结构型模式】适配器模式(Adpter)
一、入门 什么是适配器模式? 适配器模式是Java中常用的结构型设计模式,它的核心作用就像现实中的电源转换器一样---让原本不兼容的两个接口能够协同工作。 为什么要用适配器模式? 假设我们需要在电商系
138 10
|
9月前
|
设计模式 供应链 安全
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽
中介者模式定义了一个中介对象来封装一组对象之间的交互方式。中介者使得各对象之间不需要显式地相互引用,从而降低了它们之间的耦合度。它通过将对象之间的交互逻辑集中到中介者对象中,使得系统的结构更加清晰,易于维护和扩展。
172 18
【再谈设计模式】中介者模式 - 协调对象间交互的枢纽
|
10月前
|
设计模式 Java 开发者
「全网最细 + 实战源码案例」设计模式——适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,通过引入适配器类将一个类的接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协作的类能够协同工作。适配器模式分为类适配器和对象适配器两种,前者通过多重继承实现,后者通过组合方式实现,更常用。该模式适用于遗留系统改造、接口转换和第三方库集成等场景,能提高代码复用性和灵活性,但也可能增加代码复杂性和性能开销。
202 28
|
9月前
|
设计模式 Java Go
【再谈设计模式】状态模式~对象行为的状态驱动者
状态模式属于行为型设计模式。它将对象的行为封装在不同的状态类中,使得对象在不同的状态下表现出不同的行为。上下文(Context):这是一个包含状态对象的类,它定义了客户感兴趣的接口,并维护一个具体状态对象的引用。上下文将操作委托给当前的状态对象来处理。抽象状态(State):这是一个抽象类或者接口,它定义了一个特定状态下的行为接口。所有具体的状态类都实现这个接口。具体状态(Concrete State):这些是实现抽象状态接口的类,每个具体状态类实现了与该状态相关的行为。
242 18
|
9月前
|
设计模式 中间件 Java
设计模式3:代理、适配器、装饰器模式
代理模式是一种结构型设计模式,通过中间件解耦服务提供者和使用者,使使用者间接访问服务提供者,便于封装和控制。
142 3
|
8月前
|
设计模式 机器人
课时83:模板设计模式
课时83介绍了模板设计模式,重点讲解了抽象类的定义、实际应用及代码实现。抽象类作为加强型类,提供了更高层次的设计,用于统一管理子类行为。通过机器人、人类和猪三个实例,展示了如何利用抽象类实现不同对象的共性操作,如吃饭、睡觉和工作。代码范例中定义了抽象类`Action`及其子类`Robot`、`Person`和`Pig`,并通过命令模式实现了对这些行为的调用。抽象类的最大优势在于它能规范子类方法的实现,并提供普通方法调用抽象方法的能力,确保程序逻辑的一致性和灵活性。
|
9月前
|
设计模式 算法 Java
【再谈设计模式】访问者模式~操作对象结构的新视角
  访问者模式是一种行为设计模式,旨在解决对象结构与操作逻辑的耦合问题。在软件系统开发中,当面临复杂的对象结构(如多种类型对象组成的树形或图形结构),且需要对这些对象执行不同操作时,传统方式将操作直接写在对象类中会导致类职责过多,不利于维护和扩展。而访问者模式通过将操作与对象结构分离,允许在不改变现有对象结构的情况下定义新操作,元素接受访问者访问,访问者定义对不同类型元素的操作逻辑,从而为应对这种复杂情况提供了有效的解决方案。
117 0

热门文章

最新文章

下一篇
开通oss服务