[设计模式] 结构型:适配器模式(Adapter Pattern)

什么是适配器模式

想理解适配器模式,就要先知道什么是适配器。

手机充电器能够将家用220V电压转换成5V电压,给手机充电,充电器就是个适配器,电压适配器。

手机能够感知到适配器提供的5V电压,但却无法感知到适配器背后的220V电压。

“适配”就意味着信息转换,将现有信息状态转换成另一种信息状态。做转换工作的就是适配器,目的是为了重用现有的东西。

具体到代码设计层面,就是要重复利用现有代码,属于重复利用代码的一种设计模式。

适配器模式有一个比较特别的地方,那就是使用适配器模式,不会新增加系统的实体概念。

语言说不太明白,具体看下文代码理解吧,其实很简单。

适配器模式设计与实现

适合使用适配器模式的核心要点就是一个:

能够花费较小代价,将一个已经实现的东西,转换成另一个需要的东西

还是拿220V电压转5V电压的适配器举例吧,有两种实现方式:类适配器、对象适配器。

类适配器

这种实现方式,是利用了编程语言的多继承机制,C++是多继承的,所以可以很方便的实现,但是Java就会受限制,因为Java只支持单继承,不支持多继承。

因此,如果是Java语言,尽量不要使用类适配器的实现方式。

// 电压
public interface Voltage {
    public int output();
}

// 220V:国家花大力气实现的
public class Voltage220 implements Voltage {
    @Override
    public int output() {
        return 220;
    }
}

// 5V:我现在需要的,用适配器模式转换
public class Voltage5 extends Voltage220 implements Voltage {
    @Override
    public int output() {
        int output = super.output();// 国家的220V
        return output / 44;// 转换成5V
    }
}

Voltage5满足需求,提供了5V电压,但是电压它不是自己实现的,它是借助了Voltage220,使用适配器模式将其转换成了需要的。

这就是适配器模式,没什么复杂的哈。

对象适配器

这种实现方式,使用的是对象聚合的概念,没有使用多继承机制,所以这是Java语言的首选实现方式,C++随意。

// 电压
public interface Voltage {
    public int output();
}

// 220V:国家花大力气实现的
public class Voltage220 implements Voltage {
    @Override
    public int output() {
        return 220;
    }
}

// 5V:我现在需要的,用适配器模式转换
public class Voltage5 implements Voltage {
    private Voltage voltage;// 国家实现

    public Voltage5(Voltage voltage) {
        this.voltage = voltage;
    }

    @Override
    public int output() {
        int output = voltage.output();// 国家的220V
        return output / 44;// 转换成5V
    }
}

对象适配器的实现方式不涉及继承机制,实现较为灵活,实现类的耦合性也比较低,建议首选。

总结

适配器模式特别简单,很多人都在用,但是很多人并不知道自己在用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章