您的位置:首页 > 其它

设计模式——适配器模式(Adapter Pattern)

2015-01-15 14:54 501 查看
适配器模式的定义:

适配器模式:把一个类的接口转换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的那些类能够在一起工作。举个例子,美国的电器额定电压是110V,而我国的日用电压是220V,要想在国内使用美国电器就需要用变压器将220V变成110V才正常使用。适配器模式就类似于变压器。

适配的作用有两个:1、添加新的功能。2、转换接口。转换接口是其最主要的功能。

适配器模式分为三种:类适配器、对象适配和缺省适配器(该类适配器不做详细介绍)。

适配器的通用实现方式:步骤如下

1、创建一个Target接口声明需要的所有方法。

2、创建一个Adapter类来实现Target接口声明的所有方法。

3、让Adapter直接继承被适配的Adaptee类,或聚合被适配的Adapter类通过在Adapter的方法中调用Adaptee相应的方法。并实现新增功能的代码。

适配器的构成:

1、类适配器:采用继承方式实现,被适配的类只有一个(Java语言是单继承)。



2、对象适配器:采用聚合的方式实现,被适配的类可以有多个。



Java语言中适配器模式的组成部分(注:Target不能为抽象类,Java不支持多继承)

1、Target:即所期望的Java接口。

2、Adaptee:被继承(或被聚合调用)的Java类。

3、Adapter:将Adaptee转化到增加了新功能的Target接口中。

类适配器和对象适配器的区别:

1、类适配器采用继承实现,而对象适配采用聚合实现。

2、类适配器的被适配类只能为一个,而对象适配的被适配类可以有多个。

3、当Target接口的方法过多时,类对象适配实现起来比较容易直接继承即可,而对象适配要明确地在每个方法中调用被适配类的方法比较繁琐。

适配器的使用场景:

1、当系统想要使用现有的类,但现有类的接口不符合系统的需要时。

2、当需要创建一个可复用的类,使原本接口不相容并且无关的类结合到一起使用时。

3、在设计中需要改变多个子类接口,使作用相同但名称不同的类或方法之间经行适配时。

适配器模式的优缺点:

优点:

1、解决了只能通过改变源码来实现类的协同工作的问题,满足开闭原则。

2、可以对离线产品进行改进,而不需要知道源代码。

缺点:

过多的使用适配器模式会使软件的结构变得混乱,因为对适配器的调用被其转换成对其他类的调用。

适配器的应用举例:

如ArrayMostValue类只有求最值功能,现在需要能求最值并且能排序的ArrayMostValueAndSort类。分别用两种方式实现。代码如下:

Adaptee类:

/**
* 专门求整数数组的最值
* @author 矢的丶飞跃
*
*/
public class ArrayMostValue {

int max(int[] arr) {
/*  代码省略        */
return 0;
}

int min(int[] arr) {
/*  代码省略        */
return 0;
}

}


Target接口:

/**
* 目标接口 即Target
* @author 矢的丶飞跃
*/
public interface ArrayMostValueAndSortTarget {
void sort(int[] arr);//新加的sort功能
int max(int[] arr);
int min(int[] arr);
}


Adapter类:

类适配器方式实现:

/**
* 类适配器
* @author 矢的丶飞跃
*/
public class ArrayMostValueAndSort1 extends ArrayMostValue implements
ArrayMostValueAndSortTarget {
@Override
public void sort(int[] arr) {
/*  代码省略        */
}
}


对象适配器方式实现:

/**
* 对象适配器
* @author 矢的丶飞跃
*/
public class ArrayMostValueAndSort2 implements
ArrayMostValueAndSortTarget {
private ArrayMostValue amv = new ArrayMostValue();
@Override
public void sort(int[] arr) {
/*  代码省略        */
}

@Override
public int max(int[] arr) {
return amv.max(arr);
}

@Override
public int min(int[] arr) {
return amv.min(arr);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: