设计模式(七)适配器模式

来源:互联网 发布:傅满洲 知乎 编辑:程序博客网 时间:2024/04/30 02:54

题记

    如何让一个220V电压的电源为一个只能承受110V电压的电器充电呢?

概述

    很多时候,当我们拿到第三方提供的程序的时候,发现很多功能都已经做得很好了,但也存在一些地方和我们的系统不兼容。这个时候,第三方程序提供者和我们自己的程序都早已经稳定发版,都不再希望更改。为了能在自己的系统中使用第三方提供的程序,我们就可以自己编写一个适配器程序,把第三方的程序适配成我们希望的样子。就像上面充电的例子,我们可以写一个程序,它接收220V的输入,产生110V的输出,这样就可以完成充电了。

适配器模式

    
适配器模式

    适配器模式就是利用被适配者(Adaptee)所提供的功能在适配器(Adapter)中再次封装,主要是实现Target接口的方法,客户端只管调用目标接口Target的方法,客户端完全不知道它调用Target的request方法实际上是在Adapter中把具体实现委托给了被适配者Adaptee.
    接下来完成上面充电的例子:
    充电站代码:
public class ChargeStation {    private int power;    public ChargeStation(int power) {        this.power = power;    }    public int getPower() {        return power;    }    public void setPower(int power) {        this.power = power;    }    public void charge(){        System.out.println("开始充电,电压为"+this.power+"V");    }}

    摩托车充电接口:
public interface IMotoCharge {    public void charge();}
 
    摩托车充电适配器:
public class MotoChargeImpl implements IMotoCharge {    private ChargeStation chargeStation;    public MotoChargeImpl(ChargeStation chargeStation) {        this.chargeStation = chargeStation;    }    @Override    public void charge() {        int power = chargeStation.getPower();        System.out.println("开始为摩托车充电,充电电压为"+power/2+"V");    }}

    客户端代码:
public class Client {    public static void main(String[] args) {        ChargeStation chargeStation = new ChargeStation(220);        IMotoCharge motoCharge = new MotoChargeImpl(chargeStation);        motoCharge.charge();    }}

    具体结果:

    可以看到充电站负责提供电力,本来提供的充电功能是220V,经过摩托车充电器设配后,客户端再充电的时候就能获取110V电压了,客户端不知道也不关心具体是谁提供的电源,它只知道可以调用IMotoCharge的charge方法完成充电即可,充电站也完全不需为了给摩托车充电而做出改变。
    实际上以上的适配器模式通常被叫做对象适配器模式,它主要是让适配器实现一个接口,从而针对这个接口的方法利用被适配者来完成适配。还有一个被称为类适配器的模式,它主要是利用多继承来完成适配功能。虽然在像Java和C#这一类语言中不支持多继承,但在其它支持多继承的语言中,比如C++中还是可以使用类适配器模式的。以下是类适配器模式的类图:

类适配器模式

    从上图可以看出类适配器采用继承的方式把被适配者(Adaptee)通过适配器(Adapter)转化为目标类(Target)。

总结

    适配器充当的是一个中间者,它把被适配者提供的功能通过设配器适配成客户想要的接口,达到了在不修改被适配者的前提下继续使用被适配者提供的功能的目的。

参考资料

    1.《Head First设计模式》
0 0
原创粉丝点击