文章目录

  • 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 {@Overridepublic 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();@Overridepublic 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();@Overridepublic int power5V() {int input = ac220V.power220V();//将 220 V 处理成 5VSystem.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 电压

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

  1. 适配器模式(类适配器,对象适配器,接口适配器)

    现实生活中的适配器例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器) ,这样就可以使用了. 基本介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一 ...

  2. 适配器模式之类适配器与对象适配器的区别及代码实现

    什么是适配器模式? 适配器模式(Adapter):直观理解就是使原来不能一起相互工作(接口不兼容)的两个功能通过Adapter兼容在一起. 类适配器和对象适配器 类适配器 Adapter 类继承Ada ...

  3. 设计模式--适配器模式 (类适配器和对象适配器)

    适配器模式很常用的:商城中的例子比如快递发货,那么多种快递公司:可能每个快递公司的接口对接都不一样都要适配:比如各种框架中的类似以下思想的代码,都是为了适配. public function beha ...

  4. C++设计模式——适配器模式(对象适配器、类适配器)

    http://blog.jobbole.com/109381/?winzoom=1 前言 现在的笔记本都只存在USB接口,用来口,电脑上存在的是USB接口,两者如何通信呢?可以使用USB转串口线连接电 ...

  5. 【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )

    文章目录 I . 适配器模式概念 II . 适配器模式 适用场景 III . 适配器模式 优缺点 IV . 适配器模式 与 外观模式对比 V . 适配器模式 相关角色 ( 重点 ) VI . 适配器模 ...

  6. 双向适配器 java_类适配器,双向适配器

    不兼容结构的协调--适配器模式(三) 类适配器 除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模 ...

  7. Head First设计模式读书笔记六 第七章上 适配器模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: https://blog.csdn.net/u011109881/article/details/58261956 思想 要 ...

  8. Java设计模式(四):结构性模式(适配器模式、桥接模式、装饰模式、组合模式、外观模式、亨元模式、代理模式)

    目录 一· 适配器设计模式 1.1 现实生活中的适配器例子 1.2 基本介绍 1.3 工作原理 1.4 类适配器模式 1.5 对象适配器模式 1.6 接口适配器模式 1.7 适配器模式在 Spring ...

  9. PHP设计模式:工厂(静态方法里调用newobj的方法)单例(三私一公newself)注册树(使用静态变量数组存取对象)适配器(主体建立接口适配器丰富方法)

    工厂:使用工厂类的静态方法新建需要的对象 然后在外面直接调用静态方法新建对象 <?php//要创建对象实例的类 class MyObject{} //工厂类 class MyFactory{pu ...

最新文章

  1. arcgis 中label feature太长换行_MapGIS转换为ArcGIS小结
  2. 为什么batchnormalize 有效
  3. 硬盘引导安装windows7系统的方法
  4. go gin提交form表单请求
  5. C++::CPLEX文件读写
  6. a标签传值到另一个页面_前端开发入门——HTML基础标签
  7. c/s三层结构信息系统的三个层次_网络资讯:三层架构是什么
  8. 自动关机故障常见排除法
  9. 【python教程入门学习】通过运行python脚本来更改Windows背景
  10. 用VBA实现OUTLOOK接收新邮件后的自动转发
  11. 在 HTML 语言中,试题15
  12. Route@简单应用
  13. PIC单片机应用开发实践教程(四): MPLAB X IDE Debug
  14. 初级、中级和高级开发人员之间有什么区别?
  15. 埃尼阿克计算机怎么运行的
  16. 基于boostrap的登录注册界面制作(html+css)
  17. lol服务器位置2017,LOL怎么转区 LOL转区方法 LOL转区系统2017最新教程
  18. zipfile — 访问 ZIP 压缩文件
  19. 三维视觉论文阅读:RAFT2020双目光流
  20. LInux查看系统信息命令

热门文章

  1. 石川es6课程---12、Promise
  2. R语言包在linux上的安装等知识
  3. 结对项目-四则运算 “软件”之升级版
  4. 109. Convert Sorted List to Binary Search Tree
  5. javaSE基础04
  6. (转)CSS样式表继承详解
  7. 【学习笔记】MHP-VOS: Multiple Hypotheses Propagation for Video Object Segmentation
  8. mongodb windows安装
  9. Zxing 竖屏切换 android
  10. form表单提交不刷新页面的方法