适配器不只是将一个接口转换为另一个接口吗?
是的。
Adaptor 中哪里发生了多态...?
假设您有两个类,它们做的事情大致相似,但具有不同的接口。你可以用一个适配器包装一个,这样它的接口就可以匹配另一个的接口(或者给他们两个适配器到一些共享的 API),然后相同的客户端代码可以多态地使用其中一个。
例如两个相似的类:
struct Car {
bool start();
bool accelerate_gently_to(double kph);
};
struct Bicycle {
bool start();
bool set_gear(int);
bool peddle(double rpm);
};
这样一个适配器(任意一个,Bicycle)可以使用与另一个相同的接口进行控制:
struct Bicycle_Adapter_to_Accelerate_API {
Bicycle b_; // member, base, by-pointer - whatever
bool start() { return b_.start(); }
bool accelerate_gently_to(double kph) {
int gear = calculate_best_gear_for_speed(kph);
if (!b_.set_gear(gear)) return false;
double rpm = calculate_rpm(kph, wheel_circumference, gear);
return b_.peddle(rpm);
}
};
这允许客户端代码对它们进行多态处理:
template <typename T>
void control_transport(T& t) {
t.start();
t.accelerate_gently_to(20);
sleep(60);
t.accelerate_gently_to(25);
}
假设您想使用运行时多态性(即虚拟调度)而不是编译时多态性:您可以从具有virtual bool start(); 和virtual bool accelerate_gently_to(double kph); 的基类派生Car 和适配器,或者创建第二个适配器对于Car 并让两个适配器都派生自这样的基类,那么您可以从非模板代码中进行多态调度:
void control_transport(Transport_Base_Class& t) {
t.start();
t.accelerate_gently_to(20);
sleep(60);
t.accelerate_gently_to(25);
}