深入解析设计模式中的适配器模式在C++中的运用
适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。 示例:比如你在网上买了一个手机,但是买家给你发回来了一个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; }; 我们在构造的时候将具体需要适配的适配对象传入,这样便可以根据传入不同的对象,从而对该对象进行适配。而类适配器却无法选择对象,他是对整个类进行适配。也就是把所有的三相插口全部转换为两相的,而不是针对某一个。
1、 系统需要使用现有的类,而此类的接口不符合系统的需要。 Adapter模式在实现时有以下这些值得注意的地方: 1、 目标接口可以省略,模式发生退化。但这种做法看似平庸而并不平庸,它可以使Adaptee不必实现不需要的方法(可以参考Default Adapter模式)。其表现形式就是父类实现缺省方法,而子类只需实现自己独特的方法。这有些像模板(Template)模式。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |