2008-10-30 2 views
15

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

+0

не могли бы вы предоставить ссылку на статью? – 2008-10-30 08:39:37

+0

http://en.wikipedia.org/wiki/Facade_pattern – yesraaj 2008-10-30 09:01:02

ответ

21

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

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

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

например. Перевод an example на C++ и держать его крошечного

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

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

3

Я выполнил поиск и заменил на примере 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; 
} 
2

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

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

12
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; 
} 
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 не будет напрямую использовать любые методы или непосредственно влияют на состояние класса С или любой другой подсистеме, что класс В содержит. Здесь показана только одна подсистема, потому что неважно, сколько подсистем существует.