安居多伦多
  • 多市生活
    • 多市生活
    • 加国税务
    • 旅游度假
    • 生活安全
    • 行车安全
    • 窍门集锦
  • 多市书苑
    • 热门
    • 小说
    • 教育
  • 家居信息
    • 家居信息
    • 房屋保养
    • 房屋贷款
    • 房屋租赁
    • 房屋建筑
    • 房前屋后
    • 家居风水
  • 健康保健
    • 健康保健
    • 饮食起居
    • 食品安全
    • 健身锻炼
  • 书苑账户
    • 书苑登入
    • 书苑注册
    • 忘记书苑密码
    • 书苑账户信息
    • 关于我们
    • 联系我们
    • 隐私政策
多伦多书苑
在线书籍:随时阅读,随身听书。
所有书籍 | 人文 | 人物 | 人生 | 健康 | 儿童 | 医学 | 历史 | 历史 | 古典 | 哲学宗教 | 商业 | 外国 | 寓言 | 小说 | 教育 | 风水 | 管理 | 语言 |
为使本公益资源网站能继续提供免费阅读,请勿屏蔽广告。谢谢!报告弹出广告被滥用。
  1. 安居多伦多
  2. 网上书苑
  3. IT
  4. 编程
  5. 深入浅出设计模式

深入浅出设计模式

2021-08-06 0人点赞 0条评论
点赞
x
语速1.0: 2.0
进度0:

上一页   |   返回目录   |   下一页

适配器模式

一、引子

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

这个 USB 接口转接器正是我们今天要谈到的适配器。而在软件开发中采用类似于上面方式的编码技巧被称为。

二、定义和结构

《设计模式》一书中是这样给定义的:将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。由引子中给出的例子可知,这个定义描述的功能和现实中的适配器的功能是一致的。

可能你还是不太明白为什么要使用。我们来举个例子也许能更直接的解除你的疑惑。

比如,在一个画图的小程序中,你已经实现了绘制点、直线、方块等图形的功能。而且为了让客户程序在使用的时候不用去关心它们的不同,还使用了一个抽象类来规范这些图形的接口。现在你要来实现圆的绘制,这时你发现在系统其他的地方已经有了绘制圆的实现。在你庆幸之余,发现系统中已有的方法和你在抽象类中规定的方法名称不一样!这可怎么办?修改绘制圆的方法名,就要去修改所有使用它的地方;修改你的抽象类的方法名,也要去修改所有图形的实现方法以及已有的引用。还有其它的方法没有?那就是了。

可以看出使用是为了在面向接口编程中更好的复用。如果你的系统中没有使用到面向接口编程,没有使用到多态,我想大概也不会使用到。

下面来看看的组成吧。

1) 目标(Target)角色:定义 Client 使用的接口。

2) 被适配(Adaptee)角色:这个角色有一个已存在并使用了的接口,而这个接口是需要我们适配的。

3) 适配器(Adapter)角色:这个的核心。它将被适配角色已有的接口转换为目标角色希望的接口。

放上一个简单的类图,这只是实现的一种情况:

适配器模式

三、分类

在《设计模式》一书中将分为类和对象。区别仅在于适配器角色对于被适配角色的适配是通过继承完成的还是通过组合来完成的。由于在 java 中不支持多重继承,而且继承有破坏封装之嫌,众多的书中(包括《设计模式》)都提倡使用组合来代替继承。因此这里我们就不再对类进行介绍(其实用的也很少)。

在上一小节的类图中描述的就是对象。Adapter 对 Adaptee 的转换是通过组合来完成的(如果你还搞不懂类图中基本元素的含义,请先阅读我的《UML 类图介绍》)。

四、举例

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

适配器模式

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

适配器模式

可以看出 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 原来的方法
}
}

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

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

前面我介绍过了代理模式,两者的主要区别在于代理模式应用的情况是不改变接口命名的,而且是对已有接口功能的一种控制;而则强调接口转换。

五、题外话

在 java 中有一种叫做“缺省适配模式”的应用,它和我们所讲的是完全的两种东西。缺省适配模式是为一个接口提供缺省的实现,这样子类型就可以从缺省适配模式中进行扩展,避免了从原有接口中扩展时要实现一些自己不关心的接口。在 java.awt.event 中的XXXAdapter 就是它的很好的例子,有兴趣的可以看看。

上一页   |   返回目录   |   下一页

Author:

标签: 暂无
最后更新:2021-08-06

本书评论

取消回复

©2021 安居多伦多 - 版权所有

本站由 好事来 Hostlike.com 提供技术支持。