设计模式---结构型模式之适配器模式(Adapter Pattern)
- 适配器模式定义
将一个类的接口,转换成客户期望的另外一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器模式主要有两种类型:对象适配器和类适配器。
在详细解释这两种类型时,解释部分重要角色。生活中使用的笔记本电脑,都有电源适配器,这个电源适配器的作用就是将标准电压220V交流电转变为低压直流电,供电脑充电的一种装置。这个装置便是适配器模式中的适配器角色,而标准电压220V交流电便是电源(我们也可以简称为适配者对象),笔记本通过电源适配器,可以获取到适合自己使用的低压直流电,而不需要更改厂商的API,这就是适配器作用最大的地方。
- 对象适配器
该种类型主要使用组合方式实现,适配器对象内部使用组合方式调用被适配者对象。
package adapterpattern; /** * 220V电压提供者 * @author Administrator */ public class Adaptee { /** * 提供220V标准电压 * @return */ public int provideStandardVol(){ return 220; } }
package adapterpattern; /** * 电源适配器目标接口,可以适配多种不同标准的笔记本 * @author Administrator * */ public interface Target { public int getFitnessVol(); }
package adapterpattern; /** * 电源适配器的实现 * @author Administrator */ public class ObjcetTypeAdaptor implements Target{ Adaptee adaptee; public ObjcetTypeAdaptor(Adaptee adaptee){ this.adaptee = adaptee; } /** * 获取笔记本所需要的标准电压 * @return */ public int getFitnessVol(){ int tmpVol = adaptee.provideStandardVol(); System.out.println("获取标准电压:[" + tmpVol + "V]"); System.out.println("Adaptor准备转换成适配电压"); //此处为简单示例 TODO tmpVol = 19; System.out.println("Adaptor转换成适配电压[" + tmpVol + "V]"); return tmpVol; } }
- 类适配器
该种类型主要使用继承方式实现。适配器对象通过继承来调用被适配器对象方法。
package adapterpattern; public class ClassTypeAdaptor extends Adaptee implements Target{ /** * 获取笔记本所需要的标准电压 * @return */ public int getFitnessVol() { int tmpVol = provideStandardVol(); System.out.println("获取标准电压:[" + tmpVol + "V]"); System.out.println("Adaptor准备转换成适配电压"); //此处为简单示例 TODO tmpVol = 19; System.out.println("Adaptor转换成适配电压[" + tmpVol + "V]"); return tmpVol; } }
package adapterpattern; /** * 笔记本对象 * @author Administrator * */ public class Computer { private Target target; public Computer(Target target){ this.target = target; } public void working(){ if(null != target && 0 != target.getFitnessVol()){ System.out.println("已插电源适配器,准备工作ing。。。"); }else{ System.out.println("未插电源适配器或电源适配器损坏,无法工作"); } } /** * @param args */ public static void main(String[] args) { //初始化一台标准220V电压 Adaptee adaptee = new Adaptee(); System.out.println("--------------对象适配器分割线开始-------------"); //声明一个电源适配器 Target adaptor1 = new ObjcetTypeAdaptor(adaptee); //开始构造一台电脑 Computer computer1 = new Computer(adaptor1); computer1.working(); System.out.println("笔记本1构造完毕,可以启动。。。。"); System.out.println("--------------对象适配器分割线结束-------------"); System.out.println("--------------类适配器分割线开始--------------"); Target adaptor2 = new ClassTypeAdaptor(); Computer computer2 = new Computer(adaptor2); computer2.working(); System.out.println("笔记本2构造完毕,可以启动。。。。"); System.out.println("--------------类适配器分割线结束--------------"); } } /** * 输出: * --------------对象适配器分割线开始------------- * 获取标准电压:[220V] * Adaptor准备转换成适配电压 * Adaptor转换成适配电压[19V] * 已插电源适配器,准备工作ing。。。 * 笔记本1构造完毕,可以启动。。。。 * --------------对象适配器分割线结束------------- * --------------类适配器分割线开始-------------- * 获取标准电压:[220V] * Adaptor准备转换成适配电压 * Adaptor转换成适配电压[19V] * 已插电源适配器,准备工作ing。。。 * 笔记本2构造完毕,可以启动。。。。 * --------------类适配器分割线结束-------------- */
- 两种类型适配器的比较
通过以上两个例子:将适合笔记本低压直流电目标类和标准高压交流电的适配者类解耦,通过引入适配器类来改造适配者类,而无需修改适配者类代码。
类适配器模式中类是适配者类的子类,适配器类可以通过重写来构造新的方法,灵活性更强,但是也具有一定局限性:对于不支持多重继承的语言,只能单继承。
对象适配器模式中适配器类通过组合方式来调用适配者类,可以适配多个适配者类。该类型与类适配器模式相比,不能改变适配者的方法。