Вопрос

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

Это было полезно?

Решение

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

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

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

например ,Перевод пример перейти на C ++ и сохранить его крошечным

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

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

Другие советы

class Engine
{

public:
    void Start() { }

};

class Headlights
{

public:
    void TurnOn() { }

};

//  That's 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;
}

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

// "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;
}

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

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

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

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. Здесь показана только одна подсистема, потому что не имеет значения, сколько существует подсистем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top