Быстрый вопрос о реализации паттерна фасада - PullRequest
1 голос
/ 11 июля 2020

У меня есть быстрый вопрос о моей индивидуальной реализации паттерна фасадов, просто чтобы убедиться, что я правильно понял: у меня есть класс с именем Car, который фигурирует как фасад для Engine и Lights . Кроме того, у меня есть класс 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 Ответ

0 голосов
/ 11 июля 2020

Да, ваша реализация удовлетворяет требованиям.

Имея возможность иметь Фасад для различных типов автомобилей, требуется, чтобы Фасад не только вслепую переадресовал вызовы компонентам, которые он скрывает, но также настраивает набор компонентов указанного c Car.

Вы разрешаете это с помощью общих указателей m_engine и m_lights

Для более точная аргументация с авторитетными ссылками, вы можете посмотреть этот ответ на другой вопрос SO (который был для java).

...