提问者:小点点

关于立面模式实现的快速问题


我有一个关于我的Facade模式的单独实现的快速问题,只是为了确保我对它的理解是正确的。 我有一门课叫Car,它是一个发动机和灯光的门面。 另外,我有一个驱动程序类,它可以为不同类型的汽车调用方法。 我的代码是否符合正确实现facade模式的要求?

#include <iostream>
#include <memory>

class Engine
{
public:
    void turnOn()
    {
        std::cout << "Engine turned on. \n";
    }
};

class Lights
{
public:
    void turnOn()
    {
        std::cout << "Lights turned on. \n";
    }
};

class Car // Facade for Engine and Lights
{
private:
    std::shared_ptr<Engine> m_engine;
    std::shared_ptr<Lights> m_lights;
public:
    Car(std::shared_ptr<Engine> engine, std::shared_ptr<Lights> lights) : m_engine{ engine }, m_lights{ lights } {}
    void turnCarOn()
    {
        std::cout << "Turning car on... \n";
        m_engine->turnOn();
        m_lights->turnOn();
    }
};

class Driver // Facade for Car
{
private:
    std::shared_ptr<Car> m_car;
public:
    Driver(std::shared_ptr<Car> car) : m_car{ car } {}
    void turnCarOn()
    {
        std::cout << "Driver presses some buttons... \n";
        m_car->turnCarOn();
    }
};

int main()
{
    std::shared_ptr<Engine> engine = std::make_shared<Engine>();
    std::shared_ptr<Lights> lights = std::make_shared<Lights>();
    std::shared_ptr<Car> car = std::make_shared<Car>(engine, lights);
    std::shared_ptr<Driver> driver = std::make_shared<Driver>(car);
    driver->turnCarOn();
}

共1个答案

匿名用户

是的,您的实现满足了需求。

要拥有针对不同类型汽车的Facade,不仅需要Facade盲目地将调用转发到它所隐藏的组件,而且还需要配置特定car的组件集。

您可以在共享指针M_engineM_lights的帮助下进行此操作

为了更精确的论证和权威的参考资料,你可以看看另一个SO问题的答案(这是针对Java的)。