Java-设计模式:适配器模式

329 阅读3分钟

引言

适配器模式,又名Adapter模式.在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况.这种用于填补"现有的程序"和"所需的程序"之间差异的设计模式就是Adapter模式.

举例

比如我们的电源输出的是220v电压,相当于"现有的程序",而我们电脑充电只需要10v的电压,手机充电只需要5v的电压,电脑或手机需要的电压相当于"所需的程序",而我们手机充电头就充当了适配器的角色,这两者之间的差异就由它解决.下面就由这个例子讲述Adapter模式的两种写法.

一丶 使用继承

原始电源的抽象:

//原始电源 只能输出220v电压
public class Power220V {
   protected int output220V(){
       System.out.println("正在输出电压:220v");
       return 220;
    }
}

10v电源适配器的抽象:

//继承自原始电源
public class Power10VAdapter extends Power220V{
    public int output10V(){
        int v = output220V(); //先使用原始电源输出
        if (v!=10){ //发现电压不合适
            System.out.println("正在适配10v电压..."); //开始适配
            v = 10; //适配过程
            System.out.println("适配电压成功"); //适配完毕
            System.out.println("正在输出电压:"+v+"v");
        }
        return v;
    }
}

5v电源适配器的抽象:

public class Power5VAdapter extends Power220V{
    public int output5V(){
        int v = output220V();
        if (v!=5){
            System.out.println("正在适配5v电压...");
            v = 5;
            System.out.println("适配电压成功");
            System.out.println("正在输出电压:"+v+"v");
        }
        return v;
    }
}

测试代码(客户端代码):

 public static void main(String[] args) {
        //给电脑充电
       Power10VAdapter power10VAdapter = new Power10VAdapter();
       power10VAdapter.output10V();
        System.out.println("------------------------------"); //分割线
       //给手机充电
       Power5VAdapter power5VAdapter = new Power5VAdapter();
       power5VAdapter.output5V();
    }

输出结果:

正在输出电压:220v
正在适配10v电压...
适配电压成功
正在输出电压:10v
------------------------------
正在输出电压:220v
正在适配5v电压...
适配电压成功
正在输出电压:5v

二丶使用委托

我们可以看到,在使用的继承时候,我们无非是想使用父类的某个方法,因此,可以使用委托取缔继承实现。还是上面的例子。

原始电源的抽象:

//原始电源 只能输出220v电压
public class Power220V {
   protected int output220V(){
       System.out.println("正在输出电压:220v");
       return 220;
    }
}

10v电源的抽象:

public class Power10VAdapter  {
    private Power220V power220V;

    public Power10VAdapter(Power220V power220V) {
        this.power220V = power220V;
    }

    public int output10V(){
        int v = power220V.output220V();
        if (v!=10){
            System.out.println("正在适配10v电压...");
            v = 10;
            System.out.println("适配电压成功");
            System.out.println("正在输出电压:"+v+"v");
        }
        return v;
    }
}

5v电源的抽象:

public class Power5VAdapter  {
    private Power220V power220V;

    public Power5VAdapter(Power220V power220V) {
        this.power220V = power220V;
    }

    public int output5V(){
        int v = power220V.output220V();
        if (v!=5){
            System.out.println("正在适配5v电压...");
            v = 5;
            System.out.println("适配电压成功");
            System.out.println("正在输出电压:"+v+"v");
        }
        return v;
    }
}

测试代码(客户端代码):

public static void main(String[] args) {
        //给电脑充电
       Power10VAdapter power10VAdapter = new Power10VAdapter(new Power220V());
       power10VAdapter.output10V();
        System.out.println("------------------------------"); //分割线
       //给手机充电
       Power5VAdapter power5VAdapter = new Power5VAdapter(new Power220V());
       power5VAdapter.output5V();
    }

输出结果:

正在输出电压:220v
正在适配10v电压...
适配电压成功
正在输出电压:10v
------------------------------
正在输出电压:220v
正在适配5v电压...
适配电压成功
正在输出电压:5v

可以看到,输入结果是一模一样的.

总结

  • 使用继承委托的方式都能实现Adpter模式
  • 使用委托的时候需要持有拥有需要方法的原始类的引用