关于 Facade 模式实现的快速问题

Posted

技术标签:

【中文标题】关于 Facade 模式实现的快速问题【英文标题】:Quick question about Facade pattern implementation 【发布时间】: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();

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于关于 Facade 模式实现的快速问题的主要内容,如果未能解决你的问题,请参考以下文章

外观模式facade

设计模式之外观模式(Facade)摘录

Facade模式

Facade 设计模式

10-门面(Facade)模式Ruby实现

外观模式(Facade)C++实现