适配器模式
适配器模式是很好理解的模式了,生活中也非常常见,什么插头2口转3口,什么USB转PS2,这都算是适配器模式。说白了,就是如果有一些东西提供的接口你很像用,但是你手头没有好的接口使用它,这个就需要一个适配器,将你需要的接口转换成你所拥有的接口。这样的好处也是显而易见,就是你不用改变你现在所拥有的接口,保证你在任何地方的用法都不需要修改,然后底层的实现由适配器调用需要的接口来具体实现。
常见的场景
使用第三方库的时候,第三方的库肯定不能适用所有的系统,所以需要一个适配器来转换。
优点
1.屏蔽了具体的实现方式,实现了依赖倒转。
2.可以把不统一的接口封装起来,使之成为统一的接口。
3.把本来不方便适用的接口转换成统一的接口。
缺点
C++实现
1 #ifndef _ADAPTER_H_ 2 #define _ADAPTER_H_ 3 4 #include "Adaptee.h" 5 6 7 class Target 8 { 9 public: 10 Target(); 11 virtual ~Target(); 12 13 virtual void request() = 0; 14 }; 15 16 17 class Adapter: public Target 18 { 19 public: 20 Adapter(); 21 ~Adapter(); 22 23 void request(); 24 25 26 private: 27 Adaptee* adaptee; 28 }; 29 30 31 #endif
1 #include "Adapter.h" 2 3 4 Target::Target() 5 { 6 7 } 8 9 10 Target::~Target() 11 { 12 13 } 14 15 16 Adapter::Adapter(): 17 adaptee(new Adaptee()) 18 { 19 20 } 21 22 23 Adapter::~Adapter() 24 { 25 26 } 27 28 29 void Adapter::request() 30 { 31 adaptee->specificRequest(); 32 }
1 #ifndef _ADAPTEE_H_ 2 #define _ADAPTEE_H_ 3 4 class Adaptee 5 { 6 public: 7 Adaptee(); 8 ~Adaptee(); 9 10 void specificRequest(); 11 12 }; 13 14 15 #endif
1 #include "Adaptee.h" 2 #include <stdio.h> 3 4 5 Adaptee::Adaptee() 6 { 7 8 } 9 10 11 Adaptee::~Adaptee() 12 { 13 14 } 15 16 17 void Adaptee::specificRequest() 18 { 19 fprintf(stderr, "this is specificRequest\n"); 20 }
1 #include "Adapter.h" 2 3 4 int main() 5 { 6 Target* tar = new Adapter(); 7 tar->request(); 8 return 0; 9 }
1 g++ -o client client.cpp Adapter.cpp Adaptee.cpp
运行结果