根据Wiki https://en.wikipedia.org/wiki/Decorator_pattern#Usage
装饰器可以在运行时添加或更改接口的行为。另外,当包装器必须遵守特定的接口并且必须支持多态行为,和Facade时,可以使用 适配器需要与基础对象的接口。
我不了解Decimal
。
多态性在Adaptor中发生了什么,适配器不只是将一个接口转换为另一个接口吗?
答案 0 :(得分:1)
适配器不只是将一个接口转换为另一个接口吗?
是的
多态性在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);
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);
}
说您想使用运行时多态性(即虚拟调度)而不是编译时多态性:您可能已经从具有Car
和virtual bool start();
的基类派生了virtual bool accelerate_gently_to(double kph);
和适配器,或为Car
创建第二个适配器,并让两个适配器都从此类基类派生,然后可以从非模板代码多态分派:
void control_transport(Transport_Base_Class& t) {
t.start();
t.accelerate_gently_to(20);
sleep(60);
t.accelerate_gently_to(25);
}
答案 1 :(得分:0)
这只是意味着可以将包装器传递给客户端,并且客户端必须在不知道包装器具体类型的情况下与包装器一起良好工作。客户端只需要知道包装器在其中实现的接口即可。
我认为Wiki文章的作者在这里有些冗长。