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





Я выполнил поиск и замену на примере C#. Это может вам не помочь, потому что, если вы понимаете C++, вы должны понимать C#, поскольку он использует те же конструкции и ключевые слова (классы, функции, пространства имен, общедоступные и т. д.)
// "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++ для Фасад.
Шаблон фасада: обеспечивает унифицированный - упрощенный интерфейс для сложной подсистемы или набора интерфейсов. Он обеспечивает интерфейс более высокого уровня, одновременно отделяя клиента от сложной подсистемы.
Пример, который поможет вам понять .. водитель такси. Вы говорите водителю такси: «Отвези меня в PointX» (унифицированный упрощенный высокоуровневый интерфейс), который затем начинает последовательность действий (поворачивает ключ, переключает передачу, нажимает на педаль акселератора и т. д.) Для выполнения задачи. Он абстрагируется от сложности основных подсистем (коробки передач, двигателя и т. д.), Чтобы вам не приходилось о них беспокоиться. Водитель также отделяет вас от используемого транспортного средства ... вы не взаимодействуете напрямую с автомобилем. Вы могли бы дать ему Merc, но вашим интерфейсом для Driver все равно будет TakeMeTo (X) ... вы не привязаны к какой-либо конкретной модели / марке автомобиля.
В реальном примере вы найдете фасады, на которых вы взаимодействуете со сторонними компонентами или библиотеками. Вы не хотите, чтобы ваш код зависел от конкретного поставщика, поэтому вы вводите интерфейс фасада для разделения. Также вы упростите этот интерфейс, например ваш интерфейс фасада будет иметь метод под названием SendData (string), но внутренне реализация может вызывать n методов в m подпакетах в определенном порядке для выполнения задачи. Это то, что показано на схеме на странице википедии.
например Перевод пример на C++ и сохранение его крошечного размера
sResource = LWCPPSimple::get("http://www.perl.org")
Здесь вымышленная библиотека для WWW на C++ - это фасад, который объединяет протокол, сеть и аспекты анализа проблемы, так что я могу сосредоточиться на своей основной задаче - получении ресурса. Метод get скрывает / инкапсулирует / сохраняет в одном месте сложность (а в некоторых случаях уродство) HTTP, FTP и других разнообразных протоколов, запрос-ответ, управление соединением и т. д. Также, если завтра создатели LWCPPSimple найдут способ сделать get () вдвое быстрее, я получаю преимущества в производительности бесплатно. Мой клиентский код не нужно менять.
Вау. Мне нравится это объяснение. То есть, я знал, что такое фасад, но это просто здорово.
Отличное объяснение, может хорошо сочетаться с этим примером кода. stackoverflow.com/questions/249581/…
Пожалуйста, прекратите использовать аналогии. Вы могли бы легко сказать, что класс A использует класс B, который использует класс C, а класс A не может использовать класс C напрямую.
@omouse, если бы я мог проголосовать против вашего комментария, я бы сделал это. Мало того, что аналогии полезны для объяснения, но ваше объяснение фасада, состоящее из одного предложения, даже неверно.
@ Майк Дэниелс, как это не правильно? у вас есть один класс, косвенно использующий многие другие через «упрощенные» функции. Аналогии полезны, но их можно не заметить.
@omouse, ваше объяснение из одного предложения подразумевает, что есть причина, по которой A не может использовать C напрямую. Это не всегда так.
@omouse - многие люди, с которыми я разговаривал, похоже, любят примеры; они более «липкие», чем проза. Они мысленно связывают пример с концепцией и затем могут вспомнить его гораздо лучше, чем просто чтение прозы. Но у каждого свой способ обучения .. вы имеете право на свое мнение.
отличное объяснение рисунка фасада, найденного в Интернете. прекрасная работа
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;
}
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. Здесь показана только одна подсистема, потому что количество подсистем не имеет значения.
не могли бы вы дать ссылку на статью?