【问题标题】:Quick question about Facade pattern implementation关于 Facade 模式实现的快速问题
【发布时间】:2020-11-01 02:34:52
【问题描述】:

我有一个关于外观模式的个人实现的快速问题,只是为了确保我理解正确: 我有一个名为Car 的类,它被视为EngineLights 的外观。另外,我有一个Driver 类,它可以为不同种类的汽车调用方法。 我的代码是否符合正确实现外观模式的要求?

#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();
}

【问题讨论】:

    标签: c++ design-patterns facade


    【解决方案1】:

    是的,您的实现满足要求。

    能够为不同类型的汽车提供Facade,这要求Facade 不仅要盲目地将调用转发到它隐藏的组件,还要配置特定Car 的组件集。

    您可以借助共享指针 m_enginem_lights 来实现这一点

    对于权威参考的更精确论证,您可以查看this answer to another SO question(用于 java)。

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 2018-08-11
      • 2013-06-24
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 2021-08-06
      • 2020-02-11
      相关资源
      最近更新 更多