适配器模式
1.适配器模式动机及定义
1.1模式动机
在现实生活中,经常存在一些不兼容的事物。如某电器的工作电压与家庭交流电电压不一致,网络速度与计算机处理速度不一致,某硬件设备提供的接口与计算机支持的接口不一致等。在这种情况下,我们可以通过一个新的设备使原本不兼容的事物可以一起工作,这个新的设备称为适配器。在软件开发中,也存在一些不一致的情况,同样,也可以通过一种称为适配器模式的设计模式来解决这类问题。
在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器(Adapter),它所包装的对象就是适配者(Adaptee),即被适配的类。适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说,当客户类调用适配器对方法时,在适配器类对内部将调用适配者类对方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使用由于接口不兼容而不能交互的类可以一起工作,这就是适配器模式的模式动机。
1.2模式定义
适配器模式定义(Adapter Pattern)定义:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构性模式。
英文定义:“Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.”
2.适配器模式结构与分析
适配器模式包括类适配器和对象适配器,下面分别对两种适配器进行结构分析。
2.1模式结构
图1 类适配器模式结构图
当使用继承时,接口有污染,不符合迪米特原则,会将父类接口方法也实现。
图2 对象适配器模式结构图
适配器模式包含如下角色。
1.Target(目标抽象类)
目标抽象类定义客户要用的特定领域的接口,可以是个抽象类或接口,也可以是具体类;在类适配器中,由于Java语句不支持多重继承,它只能是接口。(但在其他语言中,可以是一个类,例如:C++)
2.Adapter(适配器类)
适配器类可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。适配器Adapter是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类来使二者产生联系;在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
3.Adaptee(适配者类)
适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码。
4.Client(客户类)
在客户类中针对目标抽象类进行编程,调用在目标抽象类中定义的业务方法。
3.适配器模式实例与解析
题目:现有一个接口DataOperation定义了排序方法sort(int[]) 和查找方法search(int[], int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法,类BinarySearch 的binarySearch(int[], int)方法实现了二分查找算法。现使用适配器模式设计一个系统,在不修改源代码的情况下将类QuickSort和类BinarySearch的方法适配到DataOperation接口中。绘制类图并编程实现。 (要求实现快速排序和二分查找)。
3.1实例类图