// // // // // // // // //
///2013.1.24
// // // // // // // // //
这一个设计模式有以下三种分支:
One-way adapter;
Two-way adapter;
Pluggable adapter。
鉴于本文面向较为基础,
最后一个暂且不表。
如果有兴趣,可以上网寻找更多相关资料。
【核心】将用户的需求与一个已经存在的实体(Adaptee)所适配的一个转换器。
来看一下UML图:
一个很简单的例子,
就是插座的接口了。
有些电器为二眼插头接口,
但很不巧,
家里的插座只能插三眼插头,
怎么办呢?(不要说换插座)
这时候就需要一个二转三插头转换器了(自定义名称,转载请注明出处^_^),如下图所示:
能够将用户的需求(用三眼插座充电)与已有的实体(二眼插头)进行匹配,
从而满足用户需求。
这是一个很简单的设计模式,
但是它的使用面是相当的广。
因为它自身的特点:
在不改变已存在的实体(Adaptee类)的情况下,
对用户需求进行匹配。
因此即使使用者不知道原有类的内部结构,
也可以根据不同的需求对其进行相应转化。
而Two-way Adapter则更进一步,
对双方进行转换。
使各自满足对方的需求。
代码实例:
【大致思路】
继承自用户需求类Target的Adapter方法,需要将已有实体Adaptee类的功能转化为用户所需要的功能。
adapter.h
#ifndef _ADAPTER_H_ #define _ADAPTER_H_ //Client's interface class Target { public: Target(){} ~Target(){} virtual void Request() = 0; }; //Original Object(Can not be modified) class Adaptee { public: char* specialRequest(); }; class Adapter:public Target,private Adaptee { public: Adapter(){}; ~Adapter(){} void Request(); }; #endif
#include"Adapter.h" #include<iostream> char* Adaptee::specialRequest() { return "Two-Enter Plugs"; } void Adapter::Request() { //Call specialRequest from Adaptee std::cout<<this->specialRequest()<<" transform to Three-Enter Plugs"<<std::endl; }
#include"Adapter.h" int main() { Target* adapter = new Adapter(); adapter->Request(); return 0; }
【注意事项】
在Adapter选择的继承方式中,Target是public继承的,但是Adaptee是private继承的。
这是为什么呢?
因为Target是接口,是用户的需求,这是公开的。
但是Adaptee是已经存在的实体,
用户是不能够直接访问的。(如果不知道private继承方式请自行google)
除此之外,
更多使用适配器的时候,
Adaptee的内部具体代码是不可知的,
只有对外的一些接口名称。
这种情况下,
我们又怎么能让用户去调用呢?