说道适配器模式,又要说到那句老话了。计算机科学领域的任何问题, 都可以通过添加一个中间层来解决。适配器模式也是这样的一个中间层。
那么它的出现主要是要解决什么问题呢?我们现实生活中的太多事软件系统都是按照分层架构来构建的,自顶向下。有时候我们会遇到这样一个问题:现在软件已经写完了,可以正常工作了。但是现在需求发生了变动。之前软件设计的是支持Android平台。现在需要同时支持iOS平台了。但是我们又不想重头来专门为iOS平台写一份。我们想重用原来写好的代码,因为其实很多逻辑都是平台无关的。只有跟系统直接打交道的部分依赖于各个系统的不同实现。那么这个时候我们就可以适当的增加一个适配器层。来适配平台相关的部分。让上层代码对底层代码的调用达到平台无关。者就是适配器的作用。
或者再举个生活中的例子,比如我们在大陆的交流电都是220V的,但是如果我们去到香港,他们就是110V了。这个时候,我们的做法都是带上一个电源适配器,用来做转换。这样就解决了不能充电工作的问题了。
起初我们只有一个Charger类,客户端代码直接创建一个Chager类,然后调用Charging方法。
class Charger {
public void charging() {
System.out.println("charging with 220V");
}
}
public static void main(String[] args) {
Charger charger = new Charger();
charger.charging();
}
输出结果:charging with 220V
现在我要加入一个Charger,工作在110V电压下,我们称它Charger110,然后创建一个Adapter继承自Charger。Adapter里面维护一个Charger110的引用。在Adapter的charging方法中调用Charger110的Charging方法。具体代码如下:
class Charger {
public void charging() {
System.out.println("charging with 220V");
}
}
class Charger110{
public void charging110() {
System.out.println("charging with 110V");
}
}
class Adapter extends Charger{
private Charger110 charger;
public Adapter(Charger110 charger) {
this.charger = charger;
}
@Override
public void charging() {
charger.charging110();
}
}
public class AdapterPattern {
public static void main(String[] args) {
Charger110 charger110 = new Charger110();
Charger charger = new Adapter(charger110);
charger.charging();
}
}
这样的话我们看到,客户端依然是charger.charging();
上层代码不需要做改动。就可以工作了。
那下面我们按照惯例我们用C++和C分别来实现一次吧。
class Charger{
public:
void charging(){
cout << "charging with 220V\n";
}
};
class Charger110{
public:
void charging(){
cout << "changing with 110V\n";
}
};
class Adapter : public Charger{
public:
Adapter(Charger110 *charger){
this->charger = charger;
}
void charging(){
charger->charging();
}
private:
Charger110 *charger;
};
int main(int argc, const char * argv[]) {
Adapter *adapter = new Adapter(new Charger110());
adapter->charging();
return 0;
}
在来看一下C代码吧:
typedef struct _Charger110{
void (*charging)(struct _Charger110 *charger);
}Charger110;
void charging110(struct _Charger110 *charger){
printf("charging with 110V\n");
}
Charger110 *newCharger(){
Charger110 * cha = (Charger110 *)malloc(sizeof(Charger110));
cha->charging = charging110;
return cha;
}
typedef struct _Adapter{
Charger110 * charger;
void (*charging)(struct _Adapter * adapter);
}Adapter;
void charging_adapter(struct _Adapter * adapter){
if(adapter != NULL){
adapter->charger->charging(adapter->charger);
}
}
Adapter *newAdapter(){
Adapter * adapter = (Adapter *)malloc(sizeof(Adapter));
adapter->charger = newCharger();
adapter->charging = charging_adapter;
return adapter;
}
int main(int argc, char** argv){
Adapter *adapter = newAdapter();
adapter->charging(adapter);
return 0;
}