Объяснить шаблон фасада с примером С++?

Я проверил с статью wikipedia, и похоже, что отсутствует версия кода на С++ примера кода. Я не могу полностью оценить шаблон Facade без этого, можете ли вы, пожалуйста, объяснить это мне с помощью С++?

Ответы

Ответ 1

Фасад: обеспечивает унифицированный - упрощенный интерфейс для сложной подсистемы или набора интерфейсов. Он обеспечивает интерфейс более высокого уровня, одновременно отделяя клиента от сложной подсистемы.

Пример, который поможет вам понять.. водителя такси. Вы скажете драйверу кабины "Возьми меня в PointX" (унифицированный упрощенный интерфейс высокого уровня), который затем начинает с последовательности действий (поворачивает ключ, меняет передачу, нажимает на ускоритель и т.д.) Для выполнения задачи. Он абстрагирует сложность базовых подсистем (коробка передач, двигатель и т.д.), Поэтому вам не нужно беспокоиться о них. Драйвер также отделяет вас от используемого транспортного средства... вы не напрямую взаимодействуете с автомобилем. Вы могли бы дать ему Merc, но ваш интерфейс к Driver все равно будет TakeMeTo (X).. вы не привязаны к какой-либо конкретной модели/машине.

В реальном мире вы найдете фасады, где вы взаимодействуете с сторонними компонентами или библиотеками. Вы не хотите, чтобы ваш код зависел от конкретного поставщика, поэтому вы вводите интерфейс фасада для развязки. Также вы упростите этот интерфейс, например. ваш интерфейс фасада будет иметь метод SendData (string), но внутренне реализация может вызывать n методов на m подпакетах в определенном порядке, чтобы выполнить задачу. Это показывает диаграмма на странице wikipedia.

например. Перевод пример на С++ и сохранение его крошечного

sResource = LWCPPSimple::get("http://www.perl.org")

Здесь фиктивная библиотека для WWW на С++ - это фасад, который объединяет аспекты протокола, сети и синтаксического анализа проблемы, чтобы я мог сосредоточиться на моем основном сосредоточении на извлечении ресурса. Метод get скрывает/инкапсулирует/удерживает в одном месте сложность (и в некоторых случаях уродство) HTTP, FTP и других разнообразных протоколов, запрос-ответ, управление соединениями и т.д. Также, если завтра создатели LWCPPSimple найдут способ заставить get() быть в два раза быстрее, я получаю преимущества производительности бесплатно. Мой код клиента не должен меняться.

Ответ 2

class Engine
{

public:
    void Start() { }

};

class Headlights
{

public:
    void TurnOn() { }

};

//  That your facade.
class Car
{

private:
    Engine engine;
    Headlights headlights;

public:
    void TurnIgnitionKeyOn()
    {
        headlights.TurnOn();
        engine.Start();
    }

};

int Main(int argc, char *argv[])
{
    //  Consuming facade.
    Car car;
    car.TurnIgnitionKeyOn();

    return 0;
}

Ответ 3

Я сделал поиск и заменил на примере С#. Это может вам не помочь, потому что, если вы понимаете С++, вы должны понимать С#, поскольку он использует те же конструкции и ключевые слова (классы, функции, пространства имен, общедоступные и т.д.)

// "Subsystem ClassA" 
#include <iostream>
class SubSystemOne
{
public:
    void MethodOne()
    {
        std::cout << " SubSystemOne Method" << std::endl;
    }
}

// Subsystem ClassB" 

class SubSystemTwo
{
public:
    void MethodTwo()
    {
        std::cout << " SubSystemTwo Method" << std::endl;
    }
}

// Subsystem ClassC" 

class SubSystemThree
{
public:
    void MethodThree()
    {
            std::cout << " SubSystemThree Method" << std::endl;
    }
}

// Subsystem ClassD" 

class SubSystemFour
{
public:
    void MethodFour()
    {
        std::cout << " SubSystemFour Method" << std::endl;
    }
}

// "Facade" 

class Facade
{
    SubSystemOne one;
    SubSystemTwo two;
    SubSystemThree three;
    SubSystemFour four;

public:
    Facade()
    {
    }

    void MethodA()
    {
        std::cout << "\nMethodA() ---- " << std::endl;
        one.MethodOne();
        two.MethodTwo();
        four.MethodFour();
    }
    void MethodB()
    {
        std::cout << "\nMethodB() ---- " << std::endl;
        two.MethodTwo();
        three.MethodThree();
    }
}

int Main()
{
    Facade facade = new Facade();

    facade.MethodA();
    facade.MethodB();

    return 0;
}

Ответ 4

В некотором смысле, Facade - это просто API для клиентов, которые хотят взаимодействовать с чем-то скрытым.

Фасад полезен при представлении простого C API для чего-то, что реализовано на С++ или просто более сложного, чем API. Или получить фиксированный барьер между клиентом и библиотекой, когда библиотеке необходимо пройти множество итеративных обновлений, и вы хотите как можно меньше повлиять на клиента. Например, если библиотеку на C необходимо обновить внутренне до С++ или что-то еще или просто поменять местами на что-то совершенно другое, тогда Facade является хорошим средним уровнем для клиента.

Ответ 5

Есть примеры С++ для Facade на этом отличном сайте по шаблонам проектирования.

Ответ 6

class A {
    private B b; // Class A uses Class B, the "interface"
    public int f() { return b.g(); }
};

class B {
    private C c; // class B uses class C, a "subsystem"
    private ... ...; // other subsystems can be added
    public int g() { c.h(); return c.i(); }
};

class C { // a subsystem
    public void h() { ... }
    public int i() { return x; }
};

Класс A не будет напрямую использовать какие-либо методы или напрямую влиять на состояние класса C или любой другой подсистемы, содержащейся в классе B. Здесь показана только одна подсистема, потому что неважно, сколько подсистем существует.