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

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

не могли бы вы дать ссылку на статью?

Paolo Tedesco 30.10.2008 11:39
en.wikipedia.org/wiki/Facade_pattern
yesraaj 30.10.2008 12:01

Редактирование вашего вопроса будет более полезным для других.

tonylo 30.10.2008 15:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
3
19 954
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я выполнил поиск и замену на примере 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 () вдвое быстрее, я получаю преимущества в производительности бесплатно. Мой клиентский код не нужно менять.

Вау. Мне нравится это объяснение. То есть, я знал, что такое фасад, но это просто здорово.

Thomas Owens 30.10.2008 15:21

Отличное объяснение, может хорошо сочетаться с этим примером кода. stackoverflow.com/questions/249581/…

Schalk Versteeg 30.10.2008 16:22

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

user9903 16.03.2010 22:10

@omouse, если бы я мог проголосовать против вашего комментария, я бы сделал это. Мало того, что аналогии полезны для объяснения, но ваше объяснение фасада, состоящее из одного предложения, даже неверно.

Mike Daniels 16.03.2010 22:20

@ Майк Дэниелс, как это не правильно? у вас есть один класс, косвенно использующий многие другие через «упрощенные» функции. Аналогии полезны, но их можно не заметить.

user9903 17.03.2010 01:57

@omouse, ваше объяснение из одного предложения подразумевает, что есть причина, по которой A не может использовать C напрямую. Это не всегда так.

Mike Daniels 17.03.2010 02:17

@omouse - многие люди, с которыми я разговаривал, похоже, любят примеры; они более «липкие», чем проза. Они мысленно связывают пример с концепцией и затем могут вспомнить его гораздо лучше, чем просто чтение прозы. Но у каждого свой способ обучения .. вы имеете право на свое мнение.

Gishu 17.03.2010 05:53

отличное объяснение рисунка фасада, найденного в Интернете. прекрасная работа

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

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