文章目录

  • 23种设计模式——适配器模式
    • 1、适配器模式概述
    • 2、适配器模式的结构图
    • 3、类适配器模式的实现
    • 4、对象适配器模式的实现
    • 5、接口适配器的实现

23种设计模式——适配器模式

1、适配器模式概述

背景

在软件设计中可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。

适配器模式介绍

适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。

适配器模式属于结构型模式。

主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。

适配器工作原理

1、适配器模式:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容

2、从用户的角度看不到被适配者,是解耦的

3、用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法

4、用户收到反馈结果,感觉只是和目标接口交互,如图

适配器模式的优缺点

优点:

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
  • 在很多业务场景中符合开闭原则。

缺点:

  • 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

2、适配器模式的结构图

适配器模式的结构

适配器模式(Adapter)包含以下主要角色。

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

适配器模式的结构图

类适配器模式:

对象适配器模式:

3、类适配器模式的实现

类适配器模式介绍

适配器通过继承适配者类,实现目标接口,完成适配者 ----》目标接口的转换。

类适配器模式的实现

编写适配者类:

public class Voltage220V {//输出220V的电压public int output220V(){int src = 220;System.out.println("电压为"+src+"伏");return src;}
}

编写目标接口:当前系统业务所期待的接口

public interface IVoltage5V {public int output5V();
}

编写适配器:继承适配者类,实现目标接口

public class VoltageAdapter extends Voltage220V implements IVoltage5V{@Overridepublic int output5V() {//调用Voltage220V里的方法得到220Vint srcV = output220V();//把220V转换成5V并输出int dstV =srcV / 44 ;return dstV;}
}

编写业务:

public class Phone {public void charging(IVoltage5V iVoltage5V){if (iVoltage5V.output5V() == 5){System.out.println("适配后的电压5V,可以充电");}else {System.out.println("适配后的电压异常,不能充电");}}
}

编写测试类:

public class client {public static void main(String[] args) {System.out.println("测试类适配器模式:");Phone phone = new Phone();phone.charging(new VoltageAdapter());}
}

类适配器模式注意事项

1、Java是单继承机制,所以类适配器需要继承适配者类这一点算是一个缺点,因为这要求目标必须是接口,有一定局限性;

2、适配者类的方法在Adapter(适配器)中都会暴露出来,也增加了使用的成本。

3、由于其继承了适配者类,所以它可以根据需求重写适配者类的方法,使得Adapter(适配器)的灵活性增强了。

4、对象适配器模式的实现

对象适配器模式的介绍

1、基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承适配者类,而是持有适配者类的实例,以解决兼容性的问题。即:持有适配者类,实现目标接口,完成适配者->目标接口的适配

2、根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。

3、对象适配器模式是适配器模式常用的一种

对象适配器模式的实现

编写适配者类:

public class Voltage220V {//输出220V的电压public int output220V(){int src = 220;System.out.println("电压为"+src+"伏");return src;}
}

编写目标接口:当前系统业务所期待的接口

public interface IVoltage5V {public int output5V();
}

编写适配器:持有适配者类,实现目标接口

public class VoltageAdapter implements IVoltage5V {private Voltage220V voltage220V;//传入适配者类实例public VoltageAdapter(Voltage220V voltage220V){this.voltage220V = voltage220V;}@Overridepublic int output5V() {int dst = 0;//调用Voltage220V里的方法得到220Vif (null != voltage220V){int srcV = voltage220V.output220V();dst = srcV / 44;}return dst;}
}

编写业务:

public class Phone {public void charging(IVoltage5V iVoltage5V){if (iVoltage5V.output5V() == 5){System.out.println("适配后的电压5V,可以充电");}else {System.out.println("适配后的电压异常,不能充电");}}
}

编写测试类:

public class client {public static void main(String[] args) {System.out.println("对象适配器模式:");Phone phone = new Phone();phone.charging(new VoltageAdapter(new Voltage220V()));}
}

对象适配器模式注意事项

1、对象适配器和类适配器其实算是同一种思想,只不过实现方式不同。

根据合成复用原则,使用组合替代继承,所以它解决了类适配器必须继承适配者的局限性问题,也不再要求目标必须是接口。

2、使用成本更低,更灵活。

5、接口适配器的实现

接口适配器的介绍

1、一些书籍称为:适配器模式(Default Adapter Pattern)或缺省适配器模式。

2、当不需要全部实现接口提供的方法时,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们再创建抽象类的继承类,而且重写我们需要使用的那几个方法即可。

3、接口适配器适用于一个接口不想使用其所有的方法的情况。

接口适配器模式的实现

适配者作为接口:

public interface Interface4 {void m1();void m2();void m3();void m4();
}

接口适配器:

public abstract class AbsAdapter implements Interface4{@Overridepublic void m1() {}@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}
}

测试类:

public class Client extends AbsAdapter{public static void main(String[] args) {Client client = new Client();client.m2();}@Overridepublic void m2() {System.out.println("使用了m2方法");}}

23种设计模式——适配器模式相关推荐

  1. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  2. 【设计模式】Java 23种设计模式对比总结

    一.设计模式的分类 创建型模式,共五种(1-5):工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种(6-12):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  3. 23种设计模式C++实现UML+源码汇总

    设计模式-汇总 代码开源仓库地址 23种设计模式C++实现 C++中的开闭原则使用C++多态功能实现附源码 C++基于多态实现依赖颠倒原则附源码 C++ 的静态成员变量为什么一定要在类外定义 23种设 ...

  4. 【java】java开发中的23种设计模式详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  5. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  6. 坦克大战java_清华毕业大佬用一个坦克大战项目讲完了23种设计模式

    先给大家讲述一下坦克大战是怎么进行运行的. 坦克大战第一节: new 出一个窗口: 设定标题栏内容: TankFrame从Frame继承+显示: 认识paint方法,重写: 坦克大战第二节 学习gra ...

  7. JAVA设计模式总结之23种设计模式

    一.什么是设计模式                                                                                           ...

  8. c#中的23种设计模式

    C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...

  9. 23种设计模式简介_设计模式简介

    23种设计模式简介 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要 ...

  10. Go 语言实现 23 种设计模式适配器

    Go 语言实现 23 种设计模式适配器 将一个类型的接口转换成客户希望的另外一个接口,使原本由于接口不兼容而不能一起工作的类可以一起工作. Example_one package mainimport ...

最新文章

  1. 给大家推荐8个SpringBoot精选项目
  2. 聊聊未来的程序员该如何选公司和谋规划
  3. linux使用qemu教程,Linux:使用 QEMU 测试 U-BOOT的步骤
  4. ASP.NET Core - Razor页面之Handlers处理方法
  5. App正义联盟VS App Store、领英上线视频故事、亚马逊进军游戏流媒体| Decode the Week...
  6. python中__init__函数以及参数self
  7. 京东云 | AI人才联合培养计划
  8. MaxCompute Studio使用心得系列6——一个工具完成整个Python UDF开发
  9. Java反射运行时_java反射获得运行时属性的值
  10. ASM磁盘超过disk_repair_time导致磁盘状态为forcing
  11. 05DotNet基本常用类库
  12. 软件工程第四次作业——例行报告
  13. viewport属性
  14. 2021【第十二届蓝桥杯省赛】 C/C++ B组(第一场)
  15. NMEA-0183协议(多星联合定位)
  16. c花体复制_【改名用】可复制的花体英文汇总
  17. 接收IWebBrowser2的自动化事件
  18. springboot大学校园网上图书馆信息管理系统的设计与实现小程序毕业设计源码091535
  19. 微信创建公众号菜单时出现48001,api unauthorized rid怎么解决?
  20. 如何注册微信个人公众号,教程来啦!怎样注册微信个人公众订阅号

热门文章

  1. Python 蓝牙通信模块pybluez Win7
  2. SpringMVC 访问html页面乱码
  3. asc在mysql里面的意思_mysql数据库 asc函数
  4. 商品管理查询分类下的所有子类目
  5. Linux入门的基础知识点
  6. 人人商城小程序消息服务器配置,人人商城小程序订阅消息设置方法绝对好使
  7. 异步电动机的matlab建模与仿真,异步电动机的matlab建模与仿真
  8. C# 填充Excel
  9. C#程序之快速切换IP地址
  10. 大数据开发离线计算框架知识点总结