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

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


person yesraaj    schedule 30.10.2008    source источник
comment
не могли бы вы дать ссылку на статью?   -  person Paolo Tedesco    schedule 30.10.2008
comment
en.wikipedia.org/wiki/Facade_pattern   -  person yesraaj    schedule 30.10.2008
comment
Редактирование вашего вопроса будет более полезным для других.   -  person tonylo    schedule 30.10.2008


Ответы (5)


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

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

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

например Перевод примера на C++ и сохранение его миниатюрности

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

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

person Gishu    schedule 30.10.2008
comment
Ух ты. Мне нравится это объяснение. Я имею в виду, я знал, что такое Facade, но это просто здорово. - person Thomas Owens; 30.10.2008
comment
Отличное объяснение, может хорошо сочетаться с этим примером кода. stackoverflow.com/questions/ 249581/ - person Schalk Versteeg; 30.10.2008
comment
Пожалуйста, перестаньте использовать аналогии. Вы могли бы легко сказать, что класс A использует класс B, который использует класс C, а класс A не может напрямую использовать класс C. - person ; 16.03.2010
comment
@omouse, если бы я мог понизить твой комментарий, я бы это сделал. Мало того, что аналогии являются полезным подспорьем в объяснении, ваше объяснение шаблона фасада в одном предложении даже неверно. - person Mike Daniels; 16.03.2010
comment
@ Майк Дэниелс, как это не правильно? у вас есть один класс, косвенно использующий многие другие через упрощенные функции. Аналогии полезны, но могут сломаться. - person ; 17.03.2010
comment
@omouse, ваше объяснение в одном предложении подразумевает, что по какой-то причине A не может использовать C напрямую. Это не всегда так. - person Mike Daniels; 17.03.2010
comment
@omouse — многим людям, с которыми я говорил, нравятся примеры; они «липче», чем проза. Они мысленно связывают пример с понятием и затем могут вспомнить его гораздо лучше, чем просто чтение прозы. Но каждому свой способ обучения... Вы имеете право на свое мнение. - person Gishu; 17.03.2010
comment
отличное объяснение рисунка фасада, найденное в Интернете. прекрасная работа - person Mugu; 26.02.2012

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

// "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;
}
person Dave Hillier    schedule 30.10.2008

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

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

person Johann Gerell    schedule 30.10.2008

Существуют примеры C++ для Facade на этом превосходном сайте, посвященном шаблонам проектирования.

person jamesh    schedule 30.10.2008

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

person Community    schedule 16.03.2010