适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。
适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种: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;
- };
我们在构造的时候将具体需要适配的适配对象传入,这样便可以根据传入不同的对象,从而对该对象进行适配。而类适配器却无法选择对象,他是对整个类进行适配。也就是把所有的三相插口全部转换为两相的,而不是针对某一个。