【问题标题】:What is `polymorphic behavior` in Adaptor pattern?适配器模式中的“多态行为”是什么?
【发布时间】:2019-01-18 19:02:51
【问题描述】:

根据维基https://en.wikipedia.org/wiki/Decorator_pattern#Usage

装饰器可以在运行时添加或更改接口的行为。或者,适配器可以在包装器必须尊重特定接口并且必须支持多态行为时使用,在更容易或更简单的情况下使用 Facade需要与底层对象的接口。

我不明白polymorphic behavior。 Adaptor哪里发生了多态,不是adapter只是把一个接口转成另一个接口吗?

【问题讨论】:

  • 我认为这只是意味着适配器必须是一个抽象,以便外部客户端如果足够复杂,可以在适配器的不同实现之间进行交换。

标签: oop inheritance design-patterns polymorphism adaptor


【解决方案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);
        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);
}

【讨论】:

    【解决方案2】:

    它只是意味着可以将包装器传递给客户端,并且客户端必须与包装器很好地配合使用,而无需知道包装器的具体类型。客户端只需要知道包装器在其中实现的接口。

    我认为 wiki 文章的作者在这里有点冗长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2012-03-03
      • 1970-01-01
      相关资源
      最近更新 更多