Я проверил статью в Википедии, и мне кажется, что в ней отсутствует версия кода на С++. пример. Я не могу в полной мере оценить шаблон Facade без этого, не могли бы вы помочь мне объяснить его с помощью C++?
Объясните шаблон фасада на примере С++?
Ответы (5)
Фасадный шаблон: предоставляет унифицированный упрощенный интерфейс для сложной подсистемы или набора интерфейсов. Он обеспечивает интерфейс более высокого уровня, одновременно отделяя клиента от сложной подсистемы.
Пример, чтобы помочь вам понять .. таксист. Вы говорите водителю такси «Отвезите меня в PointX» (унифицированный упрощенный высокоуровневый интерфейс), который затем начинает выполнять последовательность действий (поворачивает ключ, переключает передачи, нажимает на акселератор и т. д.), чтобы выполнить задачу. Он абстрагирует сложность базовых подсистем (коробка передач, двигатель и т. д.), чтобы вам не приходилось о них беспокоиться. Водитель также отделяет вас от фактического используемого транспортного средства... вы не взаимодействуете с автомобилем напрямую. Потенциально вы могли бы дать ему Merc, но ваш интерфейс с водителем по-прежнему будет TakeMeTo( X ).. вы не привязаны к какой-либо конкретной модели/марке автомобиля.
В реальном примере вы найдете фасады, где вы взаимодействуете со сторонними компонентами или библиотеками. Вы не хотите, чтобы ваш код зависел от конкретного поставщика, поэтому вы вводите фасадный интерфейс для разделения. Также вы упростите этот интерфейс, например. ваш фасадный интерфейс будет иметь метод с именем SendData( string ), но внутри реализация может вызывать n методов для m подпакетов в определенном порядке для выполнения задачи. Это то, что показывает схема на странице википедии.
например Перевод примера на C++ и сохранение его миниатюрности
sResource = LWCPPSimple::get("http://www.perl.org")
Здесь вымышленная библиотека для WWW на C++ — это фасад, объединяющий аспекты протокола, сети и синтаксического анализа проблемы, так что я могу сосредоточиться на своей основной задаче — извлечении ресурса. Метод get скрывает/инкапсулирует/сохраняет в одном месте всю сложность (а в некоторых случаях и уродство) HTTP, FTP и других разнообразных протоколов, запросов-ответов, управления соединениями и т. д. Также, если завтра создатели LWCPPSimple найдут способ сделать get() в два раза быстрее, я получаю преимущества производительности бесплатно. Мой клиентский код не должен меняться.
Я выполнил поиск и замену в примере С#. Это может вам не помочь, потому что, если вы понимаете С++, вы сможете понять С#, поскольку он использует те же конструкции и ключевые слова (классы, функции, пространства имен, общедоступные и т. д.).
// "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++ или чего-то другого или просто заменить на что-то совершенно другое, то Facade является хорошим промежуточным уровнем для клиента.
Существуют примеры C++ для Facade на этом превосходном сайте, посвященном шаблонам проектирования.
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. Здесь показана только одна подсистема, поскольку количество подсистем не имеет значения.