设计模式之适配器模式
本文大量引用:http://blog.chinaunix.net/uid-29140694-id-4138579.html
适配器模式属于结构型设计模式,也是一种实际开发中使用非常广泛的设计模式。
首先看下GOF对适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
说到适配器大家可能会想到电脑电源适配器,为什么要用电源适配器呢?原因很简单我们的电脑不能直接插到插座上,因为插座的电源是220v的,但我们的电脑只需要20v左右的电压。适配器的作用其实就是在两者之间起到了一个转化的作用。
适配器模式应用场景描述:当要实现某个特定的功能需要依赖现有的实现,我们不想改动现有程序,但现有的程序又不能完全满足需求时,我们就可以考虑适配器模式。
适配器参与角色:
(1)目标角色(Target):系统所期待实现的目标。
(2)源角色(Adaptee):系统原有的实现,被适配的角色。
(3)适配器角色(Adapter):将原有实现转化成目标实现。
适配器模式包含两种适配方式:类适配器和对象适配器。
类适配器结构图:
首先看下GOF对适配器模式的定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
说到适配器大家可能会想到电脑电源适配器,为什么要用电源适配器呢?原因很简单我们的电脑不能直接插到插座上,因为插座的电源是220v的,但我们的电脑只需要20v左右的电压。适配器的作用其实就是在两者之间起到了一个转化的作用。
适配器模式应用场景描述:当要实现某个特定的功能需要依赖现有的实现,我们不想改动现有程序,但现有的程序又不能完全满足需求时,我们就可以考虑适配器模式。
适配器参与角色:
(1)目标角色(Target):系统所期待实现的目标。
(2)源角色(Adaptee):系统原有的实现,被适配的角色。
(3)适配器角色(Adapter):将原有实现转化成目标实现。
适配器模式包含两种适配方式:类适配器和对象适配器。
类适配器结构图:
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030170138105-1969184118.png)
类适配器的代码实现:这里以建高楼的打桩为例,打桩有时打方形桩,有时打圆形
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030164338793-860029375.png)
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030164447293-1664583115.png)
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030164507902-355858912.png)
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030164537918-1666959702.png)
下面我们再说下对象适配器的基础实现,如下为其结构图:
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030170035730-624453999.png)
对象适配器的代码实现:
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030164633668-1010712638.png)
测试代码:测试类适配器和对象适配器
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030164715980-575944299.png)
测试结果
![](https://images2017.cnblogs.com/blog/1242762/201710/1242762-20171030164736761-449456295.png)
设计模式是一种代码实现的思想,很多时候我们在写代码时要灵活的去运用设计模式切不可生搬硬套设计模式,更不应该硬套某个设计模式的标准代码结构。比如适配器模式,理论上来说凡是对原有代码的封装我们都可以理解成是一种适配的思想。
下面总结下对象适配器的优点:
(1)适配器模式可以理解成是在原有基础上的封装,不需要对原有程序进行改动,即可实现特定功能。
(2)对象适配器可以服务于多个源角色,便于程序的扩展。