最常用的设计模式---适配器模式(C++实现)

适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。

适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种:1.类的适配器 2.对象适配器,对象适配器更多一些。

(适配器模式和装饰模式很类似,下面一篇我们会学习装饰者模式,并分析他们之间的区别)


示例:比如你在网上买了一个手机,但是买家给你发回来了一个3接头的充电器,但是恰好你又没有3接头的插槽,只有2个接口的插槽,于是你很直然地便会想到去找你个3接口转两接口的转换器。简单的分析下这个转换器便是我们这里的适配器Adapter。三相插头便是我们要适配的Adaptee,两相插

类适配器

-----在我看来C++的类适配器的用多重继承实现,并提供适配后的接口。



这是你的三相插头

[cpp]  view plain  copy
  1. class ThreePhaseOutlet  
  2. {  
  3. public:  
  4.     void doThreePhasePlugin()  
  5.     {  
  6.         cout<<"三相插头强势插入!"<<endl;  
  7.     }  
  8. };  
这是你想要的两相插头

[cpp]  view plain  copy
  1. class TwoPhaseOutlet   
  2. {  
  3. public:  
  4.     virtual void doPlugin() = 0;  
  5. };  

然后你将需要找到一个转接头,将三相插头转换为“两相插头”

[cpp]  view plain  copy
  1. class OutletConvertor: public TwoPhaseOutlet,public ThreePhaseOutlet  
  2. {  
  3. public:  
  4.     void doPlugin()  
  5.     {  
  6.         doConvertor();  
  7.         doThreePhasePlugin();  
  8.     }     
  9.         void doConvertor()  
  10.     {  
  11.         cout<<"三相插头转为两厢插头!"<<endl;  
  12.     }  
  13. };  
现在你可以强势插入两相的插口了。

[cpp]  view plain  copy
  1. TwoPhaseOutlet* outlet = new OutletConvertor();  
  2. outlet->doPlugin();  

对象适配器模式-----对象适配器是将需要适配的对象进行包装然后提供适配后的接口。

对象适配器的 三相插口和转接头的代码和上面一致。只是整合步骤不一致

[cpp]  view plain  copy
  1. class OutletConvertor : public TwoPhaseOutlet  
  2. {  
  3. public:  
  4.     void doPlugin()  
  5.     {  
  6.         doConvertor();  
  7.         m_out.doThreePhasePlugin();  
  8.     }  
  9.     void doConvertor()  
  10.     {  
  11.         cout<<"三相插头转为两厢插头!"<<endl;  
  12.     }  
  13.     ThreePhaseOutlet m_out;  
  14. };  
对象适配器相比类适配器来说更加灵活,他可以选择性适配自己想适配的对象。例如我们下面把代码改成这样,你也许就会明白为什么我这样说:

[cpp]  view plain  copy
  1. class OutletConvertor : public TwoPhaseOutlet  
  2. {  
  3. public:  
  4.     OutletConvertor(ThreePhaseOutlet out)  
  5.     {  
  6.         m_out = out;  
  7.     }  
  8.     void doPlugin()  
  9.     {  
  10.         doConvertor();  
  11.         m_out.doThreePhasePlugin();  
  12.     }  
  13.     void doConvertor()  
  14.     {  
  15.         cout<<"三相插头转为两厢插头!"<<endl;  
  16.     }  
  17.     ThreePhaseOutlet m_out;  
  18. };  

我们在构造的时候将具体需要适配的适配对象传入,这样便可以根据传入不同的对象,从而对该对象进行适配。而类适配器却无法选择对象,他是对整个类进行适配。也就是把所有的三相插口全部转换为两相的,而不是针对某一个。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaopengsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值