适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。
适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种:1.类的适配器 2.对象适配器,对象适配器更多一些。
(适配器模式和装饰模式很类似,下面一篇我们会学习装饰者模式,并分析他们之间的区别)
示例:比如你在网上买了一个手机,但是买家给你发回来了一个3接头的充电器,但是恰好你又没有3接头的插槽,只有2个接口的插槽,于是你很直然地便会想到去找你个3接口转两接口的转换器。简单的分析下这个转换器便是我们这里的适配器Adapter。三相插头便是我们要适配的Adaptee,两相插
类适配器
-----在我看来C++的类适配器的用多重继承实现,并提供适配后的接口。
这是你的三相插头
class ThreePhaseOutlet { public: void doThreePhasePlugin() { cout<<"三相插头强势插入!"<<endl; } };这是你想要的两相插头
class TwoPhaseOutlet { public: virtual void doPlugin() = 0; };然后你将需要找到一个转接头,将三相插头转换为“两相插头”
class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet { public: void doPlugin() { doConvertor(); doThreePhasePlugin(); } void doConvertor() { cout<<"三相插头转为两厢插头!"<<endl; } };现在你可以强势插入两相的插口了。
TwoPhaseOutlet* outlet = new OutletConvertor(); outlet->doPlugin();
对象适配器模式-----对象适配器是将需要适配的对象进行包装然后提供适配后的接口。
对象适配器的 三相插口和转接头的代码和上面一致。只是整合步骤不一致
class OutletConvertor : public TwoPhaseOutlet { public: void doPlugin() { doConvertor(); m_out.doThreePhasePlugin(); } void doConvertor() { cout<<"三相插头转为两厢插头!"<<endl; } ThreePhaseOutlet m_out; };对象适配器相比类适配器来说更加灵活,他可以选择性适配自己想适配的对象。例如我们下面把代码改成这样,你也许就会明白为什么我这样说:
class OutletConvertor : public TwoPhaseOutlet { public: OutletConvertor(ThreePhaseOutlet out) { m_out = out; } void doPlugin() { doConvertor(); m_out.doThreePhasePlugin(); } void doConvertor() { cout<<"三相插头转为两厢插头!"<<endl; } ThreePhaseOutlet m_out; };