我想要是说适配器模式,提一下“电压”、“耳机”、“充电器”和 "USB” 的例子应该是比较恰当的了。就说说自己的亲身经历,我原来的手机是NOKIA5730。后来也不知道有没有国行,但是不推荐大家买这款手机,不适用的哈。我买的时候只有港货,可是大家知道的啊,香港的充电器和我们大陆的充电器规格是不一样的,那我要是在国内充电,原机带的充电器根本用不了,所以要花25RMB买一个公牛的适配器,这样才可以充电!!
1.初识适配器模式
我想作为一个IT人士,对于适配器应该不陌生,只不过要从理论上讲可能描述的不够到位。实际上,好多系统的开发,都要用到第三方软件,这样的话,第三方软件的接口和我们开发的软件的接口往往是不一致的,那么这时候就要“适配”了。看看GoF对适配器模式的说法:
适配器模式:将一个类的接口转换成客户希望的另外一个接口,适配器模式使得由于接口不兼容而不能一起工作的那些类可以一起工作!!!
一般情况下,适配器包含下面的几个角色:
目标抽象角色(Target) : 定义客户所期待要使用的接口,我们把手机当做客户端,客户端所需要使用充电器是大陆标准。
源角色(Adaptee) : 需要被适配的接口,在这里指的是我的手机买的时候自带的港版充电器。
适配器角色(Adapter) :用来把源接口转换成符合要求的目标接口的设备,在这里指的是我自己买的公牛的适配器。
客户端(Client) :这里指的就是我那个港版的手机了。
现在来看看适配器模式的结构图:
注:这里我们只说一致适配器模式:对象适配器模式,而不谈类适配器模式。
2.实现适配器模式的例子
现在,我们看看适配器模式到底是怎么实现的,怎么就能“在大陆使用港版的充电器了呢??”
1 #include <iostream> 2 3 using namespace std; 4 5 class TargetCharger 6 { 7 public: 8 virtual void ChargeRequest() 9 { 10 } 11 }; 12 class AdapteeCharger 13 { 14 public: 15 void SpecificRequest() 16 { 17 cout<<"使用港版充电器充电!!!"<<endl; 18 } 19 }; 20 class AdapterCharger : public TargetCharger 21 { 22 private: 23 AdapteeCharger adaptee; 24 public: 25 virtual void ChargeRequest() 26 { 27 cout<<"利用了适配器:公牛充电器,"; 28 adaptee.SpecificRequest(); 29 } 30 }; 31 32 33 int main() 34 { 35 AdapterCharger Adapter; 36 TargetCharger *target = &Adapter; 37 target->ChargeRequest(); 38 return 0; 39 }
观察代码和运行结果,得知策略模式确实是实现了!!确实完成了在大陆使用港版充电器的目的了。那么我们想一想利用适配器模式有什么好处呢?不妨假设一下,现在我又在欧洲买了一个手机,这时手机又不能再大陆充电了,怎么办呢?这时我们只需要在写一个类继承TargetCharget类完成对欧版充电器的适配,这样我们有能很方便的会用欧洲的手机。怎么样?使用适配器模式还能提供统一的接口。
3.实现适配器模式的场合和好处
首先,必须强调的是,适配器模式适用于使用第三方软件的情况,并且第三方软件提供的接口和我们开发的系统接口不一致,同时我们正在开发的系统想要改变接口已经不容易了,这时候使用适配器就比较好。其实,适配器模式更像是一个弥补型的模式,当接口不一致时,并且系统开发已经进入了很难改变的时候,这时候可以使用适配器模式,但是如果在开发的早期就发现了接口不一致,尽量不要采用适配器模式,而是最后把接口设计的一致比较好。也就是说适配器模式大部分在软件开发后期使用的一种设计模式。
具体适用的场合:
1.正在开发的系统想使用一个已经存在的类,并且该类很重要,但是该类提供的接口和系统不一致。
2.使用了第三方软件,并且第三方提供的软件的接口和系统不一致。
3.两个已经存在的类完成的功能一致,但是接口不一样。可以采用适配器模式,提供一致的接口。
4.对旧系统的复用。
使用适配器模式的好处:
1.充分利用已经存在的资源,实现软件的复用,节省开发成本和时间。
学习中的一点总结,欢迎拍砖^^