Renbobo's Blog

Wo go where our vision is.

View project on GitHub

适配器模式

27 Aug 2017

定义:适配器相当于将被调用接口转换成客户想要的调用接口的中间过程

分为对象适配器、类适配器

对象适配器

多项适配器使用过于该类的任何子类

类适配器

不需要重新实现这个被适配者,甚至可以重写被适配者的行为,因为利用继承方式

以下是对象适配器的代码实例: 我们现在要把火鸡对象封装成鸭子,相当于用火鸡来适配鸭子

Duck

# include <iostream>
# include <string.h>
using namespace std;

class Duck{
public:
Duck();
virtual Duck();
virtual void quack();
virtual void fly();
};

# include "duck.h"

Duck::Duck(){

}
Duck::Duck(){

}
void Duck::quack(){
cout << "duck quack" << endl;
}
void Duck::fly(){
cout << "duck flying 5 step" << endl;
}

Turkey

# include <iostream>
# include <string.h>
using namespace std;

class Turkey{
public:
Turkey();
Turkey();
void gobble();
void fly();
};

# include "turkey.h"

Turkey::Turkey(){

}
Turkey::Turkey(){

}
void Turkey::gobble(){
cout << "Turkey gobble" << endl;
}
void Turkey::fly(){
cout << "Turkey flying 1 setup" << endl;
}

TurkeyAdapter

# include <iostream>
# include <string.h>
# include "duck.h"
# include "turkey.h"
using namespace std;

class TurkeyAdapter : public Duck{
public:
TurkeyAdapter(Turkey * turkey);
virtual TurkeyAdapter();
virtual void quack();
virtual void fly();
Turkey * turkey;
};

# include "turkeyadapter.h"

TurkeyAdapter::TurkeyAdapter(Turkey * turkey){
this->turkey = turkey;
}
TurkeyAdapter::TurkeyAdapter(){

}
void TurkeyAdapter::quack(){
this->turkey->gobble();
}
void TurkeyAdapter::fly(){
for(int i = 0; i < 5; i++){
this->turkey->fly();
}
}

测试代码

# include <iostream>
# include "duck.h"
# include "turkey.h"
# include "turkeyadapter.h"

using namespace std;

int main(){
Turkey * turkey = new Turkey;
turkey->gobble();
turkey->fly();
Duck * turkeyadapter = new TurkeyAdapter(turkey);
turkeyadapter->quack();
turkeyadapter->fly();
return 1;
}

装饰者模式、适配器模式、外观模式 装饰者模式:在不改变原有代码的基础场进行功能扩展。 适配器模式:调用者与被调用者之间的接口转换 外观模式:让接口更简单

“最少知识”原则:只和你的密友谈话

这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为天复杂而不容易被其他人了解。 如何减少密友

对于任何对象,在该对象的方法内,我们只应该调用以下范围的方法:

  1. 该对象本身
  2. 被当做方法的参数而传递进来的对象
  3. 此方法所创建或实例化的任何对象
  4. 对象的任何组件

如果调用从另一个调用种返回对象的方法,相当于另一个对象的子部分发出请求(增加我们直接认识对象的数目)。 在这种情况下,原则要我们改为要求该对象为我们做出请求,这么一来,我们就不需要认识该对象的组件了。如下:

public float getTemp(){
Thermometer the = station.getTermometer();
return the.getTemperature();
}

这里,我们从气象站获取了温度计对象,然后在从温度计对象获取温度。

public float getTemp(){
Thermometer the = station.getTemperature();
}

应用此原则时,我们在气象站种加入一个方法,用来向温度计请求温度,这可以减少我们所一来的类的数目。

“最少知识”原则的缺点

  1. 更多的包装类被制造出来,增加负责度和开发时间
  2. 降低运行时的性能