Pergunta

Eu verifiquei com o Artigo da Wikipedia, e parece que está faltando a versão C ++ de um exemplo de código. Não consigo apreciar completamente o padrão de fachada sem isso, você pode ajudar a me explicar usando C ++?

Foi útil?

Solução

Padrão de fachada: fornece uma interface unificada - simplificada para um subsistema ou conjunto complexo de interfaces. Ele fornece uma interface de nível mais alta simultaneamente, dissociar o cliente do subsistema complexo.

Um exemplo para ajudá -lo a entender .. um motorista de táxi. Você diz ao driver de táxi 'Leve-me para Pointx' (interface de alto nível simplificada unificada) que começa em uma sequência de ações (gira a chave, muda de engrenagem, pressiona o acelerador, etc ...) para executar a tarefa. Ele abstrava a complexidade dos subsistemas subjacentes (caixa de câmbio, motor etc.) para que você não precise se preocupar com eles. O motorista também decompa você do veículo real usado ... Você não faz interface diretamente com o carro. Você poderia potencialmente dar a ele um Merc, mas sua interface para o motorista ainda seria Takemeto (x). Você não está ligado a nenhum modelo/marca específico do carro.

Em um exemplo do mundo real, você encontrará fachadas em que interface com componentes ou bibliotecas de terceiros. Você não deseja que seu código dependa de um fornecedor específico, então você apresenta uma interface de fachada para desacoplar. Além disso, você simplificará essa interface, por exemplo, sua interface de fachada teria um método chamado SendData (String), mas internamente a implementação pode chamar N métodos em M sub-pacotes em uma ordem específica para realizar a tarefa. É isso que o diagrama na página da Wikipedia mostra.

por exemplo, tradução um exemplo para C ++ e mantê -lo minúsculo

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

Aqui, a biblioteca fictícia para www em C ++ é uma fachada que unifica os aspectos de protocolo, rede e análise do problema para que eu possa me concentrar no meu foco principal de buscar o recurso. O método GET esconde/encapsula/mantém em um lugar a complexidade (e, em alguns casos Maneira de fazer obter () ser duas vezes mais rápido, recebo os benefícios de desempenho gratuitamente. Meu código de cliente não precisa mudar.

Outras dicas

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;
}

Eu fiz uma pesquisa e substituto no exemplo C#. Isso pode não ajudá -lo, porque se você entender C ++, poderá entender o C#, pois ele usa as mesmas construções e palavras -chave (classes, funções, espaços para nomes, público, etc.)

// "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;
}

Em certo sentido, uma fachada é apenas uma API para clientes que desejam interagir com algo oculto.

A fachada é útil ao expor uma API C simples para algo que é implementado em C ++ ou simplesmente mais complexo que a API. Ou para obter uma barreira fixa entre um cliente e uma biblioteca quando a biblioteca precisar passar por inúmeras atualizações iterativas e você deseja afetar o cliente o mínimo possível. Por exemplo, se uma biblioteca baseada em C precisará ser atualizada internamente para C ++ ou outra coisa, ou apenas trocada por algo completamente diferente, a fachada é uma boa camada média para o cliente.

Exemplos C ++ por Fachada Neste excelente site sobre padrões de design.

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 classe A não usará diretamente nenhum método ou afetará diretamente o estado da classe C ou qualquer outro subsistema que a Classe B contém. Apenas um subsistema é mostrado aqui porque não importa quantos subsistemas existem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top