适配器模式
定义:适配器相当于将被调用接口转换成客户想要的调用接口的中间过程
分为对象适配器、类适配器
对象适配器
多项适配器使用过于该类的任何子类
类适配器
不需要重新实现这个被适配者,甚至可以重写被适配者的行为,因为利用继承方式
以下是对象适配器的代码实例: 我们现在要把火鸡对象封装成鸭子,相当于用火鸡来适配鸭子
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;
}
装饰者模式、适配器模式、外观模式 装饰者模式:在不改变原有代码的基础场进行功能扩展。 适配器模式:调用者与被调用者之间的接口转换 外观模式:让接口更简单
“最少知识”原则:只和你的密友谈话
这个原则希望我们在设计中,不要让太多的类耦合在一起,免得修改系统中一部分,会影响到其他部分。如果许多类之间相互依赖,那么这个系统就会变成一个易碎的系统,它需要花许多成本维护,也会因为天复杂而不容易被其他人了解。 如何减少密友
对于任何对象,在该对象的方法内,我们只应该调用以下范围的方法:
- 该对象本身
- 被当做方法的参数而传递进来的对象
- 此方法所创建或实例化的任何对象
- 对象的任何组件
如果调用从另一个调用种返回对象的方法,相当于另一个对象的子部分发出请求(增加我们直接认识对象的数目)。 在这种情况下,原则要我们改为要求该对象为我们做出请求,这么一来,我们就不需要认识该对象的组件了。如下:
public float getTemp(){
Thermometer the = station.getTermometer();
return the.getTemperature();
}
这里,我们从气象站获取了温度计对象,然后在从温度计对象获取温度。
public float getTemp(){
Thermometer the = station.getTemperature();
}
应用此原则时,我们在气象站种加入一个方法,用来向温度计请求温度,这可以减少我们所一来的类的数目。
“最少知识”原则的缺点
- 更多的包装类被制造出来,增加负责度和开发时间
- 降低运行时的性能