首页 > 代码库 > 设计模式---结构型模式之适配器模式(Adapter Pattern)

设计模式---结构型模式之适配器模式(Adapter Pattern)

  • 适配器模式定义

    将一个类的接口,转换成客户期望的另外一个接口。适配器让原本接口不兼容的类可以合作无间。

    适配器模式主要有两种类型:对象适配器和类适配器。

    在详细解释这两种类型时,解释部分重要角色。生活中使用的笔记本电脑,都有电源适配器,这个电源适配器的作用就是将标准电压220V交流电转变为低压直流电,供电脑充电的一种装置。这个装置便是适配器模式中的适配器角色,而标准电压220V交流电便是电源(我们也可以简称为适配者对象),笔记本通过电源适配器,可以获取到适合自己使用的低压直流电,而不需要更改厂商的API,这就是适配器作用最大的地方。

  • 对象适配器 

    该种类型主要使用组合方式实现,适配器对象内部使用组合方式调用被适配者对象。 

技术分享
package adapterpattern;
/**
 * 220V电压提供者
 * @author Administrator
 */
public class Adaptee {
    /**
     * 提供220V标准电压
     * @return
     */
    public int provideStandardVol(){
        return 220;
    }
}
View Code

 

技术分享
package adapterpattern;

/**
 * 电源适配器目标接口,可以适配多种不同标准的笔记本
 * @author Administrator
 *
 */
public interface Target {
    public int getFitnessVol();
}
View Code
技术分享
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;
        
    }
}
View Code

 

  • 类适配器

    该种类型主要使用继承方式实现。适配器对象通过继承来调用被适配器对象方法。

技术分享
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;
    }
}
View Code
技术分享
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构造完毕,可以启动。。。。
 *  --------------类适配器分割线结束--------------
 */
View Code
  • 两种类型适配器的比较

   通过以上两个例子:将适合笔记本低压直流电目标类和标准高压交流电的适配者类解耦,通过引入适配器类来改造适配者类,而无需修改适配者类代码。

   类适配器模式中类是适配者类的子类,适配器类可以通过重写来构造新的方法,灵活性更强,但是也具有一定局限性:对于不支持多重继承的语言,只能单继承。

   对象适配器模式中适配器类通过组合方式来调用适配者类,可以适配多个适配者类。该类型与类适配器模式相比,不能改变适配者的方法。

设计模式---结构型模式之适配器模式(Adapter Pattern)