您的位置:首页 > 编程语言 > Java开发

Java的23种设计模式----适配器模式

2018-02-05 11:57 435 查看

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

1、现象模拟

大家都有这种感觉,在给平板电脑充电的时候,发现某些平板电脑只提供了USB接口的充电方式,然而,当我们只有其他接口的充电线,唯独没有USB接口的充电线的时候怎么办,聪明的我们,给充电器装上了一个USB转换器,这样就解决了问题。

这种USB接口转接器正是我们谈到的适配器,在软件开发中,采用类似上面的编码技巧就被称为“适配器模式”

2、定义与结构

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

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

由现象模拟中给出例子可知,这种定义描述的功能其实是和现实中的适配器功能是一致的

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

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

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

来看看适配器模式的组成吧

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

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

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



3、分类

在《GOF》中将适配器模式分为类适配器模式对象适配器模式

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

由于在 java 中不支持多重继承,而且继承有破坏封装之嫌,众多的书中(包括《设计模式》)都提倡使用组合来代替继承。因此这里我们就不再对类适配器模式进行介绍(其实用的也很少)。在上一小节的类图中描述的就是对象适配器模式。Adapter 对 Adaptee 的转换是通过组合来完成的

4、代码举例

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



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



可以看出 Shape、Circle 和 TextCircle 三者的关系是和标准适配器模式中 Target、Apater、Apatee 三者的关系相对应的。我们只关心这个画图程序中是怎么来使用适配器模式的

public class Circle extends Shape{
//这里引用了 TextCircle
private TextCircle tc;

public Circle (){
tc= new TextCircle(); //初始化
}

public  void display(){
tc.displayIt(); //在规定的方法里面调用 TextCircle 原来的方法
}
}


这样一个简单的适配器实现就完成了。其实在适配器角色中不仅仅可以完成接口转换的过程,而且还可以对其功能进行改进和扩充,当然这就不属于适配器模式描述的范围内了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: