“设计模式”的概念最早是由建筑设计大师亚历山大提出的。亚历山大在《建筑的永恒之道》中时这样描述的:模式是一条有三个部分组成的通用规则:它表示了一个特定环境,一类问题和一个解决方案之间的关系。每一个模式描述了一个不断重复发生的问题,以及该问题解决方案的核心设计。其实,软件行业也是如此,这些问题的本质就是模式。行业中的一些人将设计过程中那些解决特定条件下的问题的模式总结出来,就形成了我们通常所说的设计模式。 根据亚历山大的思想,我们分特定环境、问题、解决方案三个方面来描述设计模式。今天先看一下适配器模式(Adapter Pattern)吧。
特定环境:在软件开发过程中,复用以前开发的一些“现有对象”,但是这些对象并不能满足我们新的应用环境。
问题:如何将一个类的接口转换成用户希望的另一个接口,使原来由于接口不兼容而不能在一起工作的那些类在一起工作。其实,这个问题我们在生活也经常见到,比如给手机充电,交流的220V和手机的6V是不兼容的。所以,我们要借助手机“充电器”进行转换成手机需要的电压才可以正常充电,否则就不可以完成充电。同样,软件开发过程的这种问题,我们也可以通过适配器模式来解决。
解决方案:适配器模式中规定了三种角色,通过适配器将需要适配的类转换成客户所期待的接口。具体来说,是以下这三种角色:
目标接口(Target):客户所期待的接口。目标可以是具体或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或者适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
适配器模式有类适配器和对象适配器两种实现方式,但是由于类适配器通过多重继承对一个接口和另一个接口进行匹配,而java不支持多重继承,所以对于java语言来说,只有对象适配器一种实现方式。
通过适配器模式的类图,我们可以马上明白适配器模式的实现原理和过程。
适配器模式的代码实现如下
首先定义客户端所期待的接口:
package adapter;
import java.io.Console; //定义客户端所期待的接口 public interface Target { void get110v(); void get220v(); }
定义需要适配的类:
package adapter; //需要被适配的对象 public class Adaptee { public void get220v(){ System.out.println("adaptee的方法"); } }
定义适配器:
package adapter; //适配器角色:扩展源角色,实现目标角色,从而使得目标角色改动时候,不用改动源角色,只要改动适配器 public class Adapter extends Adaptee implements Target { public void get110v(){ System.out.println("adapter的方法"); } }
客户端调用:package adapter; //客户端调用 public class Program { public static void main(String rags[]) { new Program().test(); } public void test() { Target target = new Adapter(); target.get110v(); target.get220v(); } }