【设计模式】适配器模式

引子

  昨天在给新买的 MP3 充电的时候,发现这款 MP3 播放器只提供了 USB 接口充电的方式,而它所配备的充电器无法直接给 USB 接口充电,聪明的厂商为充电器装上了一个 USB 接口转换器解决了问题。

  这个 USB 接口转接器正是今天要谈到的适配器。

  而在软件开发中采用类似于上面方式的编码技巧被称为适配器模式。

定义和结构

  《设计模式》一书中是这样给适配器模式定义的:将一个类的接口转换成客户希望的另外一个接口

  Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

  由引子中给出的例子可知,这个定义描述的功能和现实中的适配器的功能是一致的。

  可能你还是不太明白为什么要使用适配器模式。

  我们来举个例子也许能更直接的解除疑惑。

  比如,在一个画图的小程序中,你已经实现了绘制点、直线、方块等图形的功能。而且为了让客户程序在使用的时候不用去关心它们的不同,还使用了一个抽象类来规范这些图形的接口。

  现在你要来实现圆的绘制,这时你发现在系统其他的地方已经有了绘制圆的实现。

  在你庆幸之余,发现系统中已有的方法和你在抽象类中规定的方法名称不一样!

  这可怎么办?

  修改绘制圆的方法名,就要去修改所有使用它的地方;修改你的抽象类的方法名,也要去修改所有图形的实现方法以及已有的引用。

  还有其它的方法没有?那就是适配器模式了。

  可以看出使用适配器模式是为了在面向接口编程中更好的复用。

  如果你的系统中没有使用到面向接口编程,没有使用到多态,我想大概也不会使用到适配器模式。

适配器模式的组成

  1. 目标(Target)角色:定义 Client 使用的接口。
  2. 被适配(Adaptee)角色:这个角色有一个已存在并使用了的接口,而这个接口是需要我们适配的。
  3. 适配器(Adapter)角色:这个适配器模式的核心。它将被适配角色已有的接口转换为目标角色希望的接口。

  放上一个简单的类图,这只是适配器模式实现的一种情况:

  

分类

  在《设计模式》一书中将适配器模式分为类适配器模式对象适配器模式

  区别仅在于适配器角色对于被适配角色的适配是通过继承完成的还是通过组合来完成的。

  由于在 java 中不支持多重继承,而且继承有破坏封装之嫌,众多的书中(包括《设计模式》)都提倡使用组合来代替继承。

  因此这里就不再对类适配器模式进行介绍(其实用的也很少)。

  在前面的类图中描述的就是对象适配器模式。Adapter 对 Adaptee 的转换是通过组合来完成的

举例

  接着上面举的画图程序的例子,先看看在添加绘制圆的需求前的类结构:

  

  添加了圆的绘制以后的类结构:

  

  可以看出 Shape、Circle 和 TextCircle 三者的关系是和标准适配器模式中 Target、Apater、Apatee 三者的关系相对应的。

  我们只关心这个画图程序中是怎么来使用适配器模式的。

  看看Circle 的实现代码吧:

class Circle extends Shape
{
         //这里引用了 TextCircle
         private TextCircle tc;
         public Circle ()
         {
              tc= new TextCircle(); //初始化
         }
         void public display()
    
        {
        }
        tc.displayIt();
        //在规定的方法里面调用 TextCircle 原来的方法
    }
}
View Code

 

  这样一个简单的适配器实现就完成了。

  其实在适配器角色中不仅仅可以完成接口转换的过程,而且还可以对其功能进行改进和扩充,当然这就不属于适配器模式描述的范围内了。

  与代理模式相比,两者的主要区别在于

  代理模式应用的情况是不改变接口命名的,而且是对已有接口功能的一种控制;而适配器模式则强调接口转换。

题外话

  在 java 中有一种叫做“缺省适配模式”的应用,它和我们所讲的适配器模式是完全的两种东西。

  缺省适配模式是为一个接口提供缺省的实现,这样子类型就可以从缺省适配模式中进行扩展 , 避免了从原有接口中扩展时要实现一些自己不关心的接口。 

  在 java.awt.event 中的XXXAdapter 就是它的很好的例子,有兴趣可以看看。

 

 

  @成鹏致远

(blogs:lcw.cnblogs.com

(emailwwwlllll@126.com)

(qq552158509)

转载于:https://www.cnblogs.com/lcw/p/3813702.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值