适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
举个例子:美国的家用电器适用的标准电压是110V,而我们中国的家用电器标准电压是220V。且,我们家庭供电是220V,仅设现在你家以前有朋友帮你从美国带了一些家电回来。可是咱们这电压不适合,但是放在那里不用,重新去买又浪费资源,那现在我们要想办法,将这些家电利用起来,我们就可以去市场买一个变压插座,将220V的电流接进去,而接出来的会自动降压到110V,那么这个变压插座所充当的角色就是:适配器。其实类似的例子有很多,比如从电信拉ADSL,你也需要一个分离器,然后一根接电话,一根接Model。下面列,我们以这个变压插座为例子,以代码的方式来说明:
package com.pattern.adapter; public class Power { /** * 返回220V电压 * @return */ public int get220Power(){ return 220; } }
package com.pattern.adapter; public interface ITarget { int get110Power(); }
package com.pattern.adapter; /** * 变压插座 */ public class Adapter extends Power implements ITarget { @Override public int get110Power() { //变压过程 return this.get220Power() - 110; } }
package com.pattern.adapter; public class Client { /** * @param args */ public static void main(String[] args) { ITarget it = new Adapter(); int power = it.get110Power(); System.out.println(power); } }
电源是我们已经有的,只能提供220V电压,现在我们新增了一个变压器,那么就可以通过个插座提供110V的电压。现在是因为这个提供电压的逻辑是我们模仿的,比较简单,所以你看不出来优势来,倘若获取电压的操作很麻烦,这样一来,你以前的代码就会得到复用,你便会体会到电源重用的好处。
可能看了上面的例子,你还没感觉到太多的好处。接下来,我们看一个指方为圆的例子:
package com.pattern.adapter; /** * 立方体 */ public class Cube { /** * 边长 */ private double width; /** * 计算体积 * @return */ public double calculateVolume(){ return width* width * width; } /** * 记录单个面的面积 * @return */ public double calculateArea(){ return width* width; } public Cube(double width) { super(); this.width = width; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } }
package com.pattern.adapter; public interface BallF { double calculateArea(); double calculateVolume(); }
package com.pattern.adapter; public class MagicFinger implements BallF{ private double radius ; private static final double PI = 3.14D; private Cube adaptee; /** * 构造方法 * @param adaptee */ public MagicFinger(Cube adaptee) { super(); this.adaptee = adaptee; this.radius = adaptee.getWidth(); } /** * 计算面积 */ @Override public double calculateArea() { return PI * 4.0D * this.radius * this.radius; } /** * 计算体积 */ @Override public double calculateVolume() { // TODO Auto-generated method stub return PI * 4.0D/3.0D * this.radius * this.radius * this.radius; } }
现在我们就是一个得到了一个正方体的内切球。 也就是说,现在给你一个正方体,让你得到他的内切球。与上面的电源不同的是:我们没有采用继承,而是产生聚合的方式来复用~
一般适配器主要用在以下情况:
1、系统需要使用现有的类,而此类的接口不符合系统的需要。就如我们例子中的电源和正方体
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3、在设计里,需要改变多个已有的子类的接口。
关于适配器模式,就讲这么多,具体的还是要自己去感觉。