Design Patterns – Um guia rápido para padrões de fachada.

Passo 1 – Palavras-chave

Definir palavras-chave é a receita secreta desta série de guias rápidos. Este método ajudou-me a compreender verdadeiramente os padrões de design, a codificá-los na minha mente e a compreender as diferenças entre outros padrões de design.

  1. Simplificação: Este é o objectivo deste padrão de design. Simplificar um sistema complicado.
  2. Restrição: A simplificação muitas vezes vem com um “custo sagrado”, restrição. Ao simplificar o código, restringimos clientes de acesso não autorizado. Portanto, evita que eles cometam erros que seriam difíceis de serem percebidos em um subsistema complicado.

Existe um tradeoff entre simplificação e restrição. Simplificar demais um sistema significa que o desenvolvedor está sobrecarregado, portanto menos liberdade do que o necessário, o que nem sempre é uma coisa boa. Sub-simplificar o padrão Facade significa que há muita liberdade, o que torna o padrão Facade irrelevante. Encontrar o equilíbrio fino é o que faz um bom, útil e eficaz padrão de Fachada.

Passo 2 – Diagrama

>

O diagrama também é baseado no exemplo dado. Para simplificar este diagrama podemos separar em três partes.

  1. Cliente: O cliente neste exemplo é o cliente de um restaurante que quer encomendar comida.
  2. Fachada: O seu trabalho é ser capaz de proporcionar ao cliente um acesso mais simplificado a numerosos subsistemas interdependentes que são considerados complicados. Neste exemplo, a encomenda de comida de um cliente exigiria uma série de chamadas cuidadosamente sequenciadas de dois subsistemas diferentes (Garçon e Cozinha).
  3. Subsistemas: Os subsistemas estão escondidos do cliente. Eles também podem não ser acessíveis ao cliente. O cliente não pode mexer em nenhum dos subsistemas onde uma simples mudança de código pode ser fatal ou mesmo quebrar outras partes desconhecidas do próprio sistema. Neste cenário, o garçom e a cozinha têm que realizar uma série de tarefas. A tarefa de um subsistema depende por vezes de outras tarefas. Por exemplo, a cozinha não pode preparar a comida se o empregado não trouxer a encomenda para a cozinha. O garçom não pode servir ao cliente se a comida não estiver cozida.

Passo 3 – Código por exemplo

Eu sugeriria copiar o código classe por classe do meu repositório git “Andreas Poyias” ou os trechos abaixo (na ordem fornecida) e colá-lo em qualquer um dos editores C++ disponíveis online como c++shell, jdoodle , onlineGDB e executá-lo para observar a saída. Depois leia os comentários ou a descrição abaixo. Leve o seu tempo, lendo-o cuidadosamente (isso significa um minuto, não menos e não mais).

Subsistemas

Neste exemplo, os dois subsistemas são o Waiter_Subsystem1 e oKitchen_Subsystem2. À primeira vista, cada subsistema parece ser independente, pois eles podem realizar determinadas tarefas individualmente. Mas isto é verdade?

#include <iostream>
using namespace std;class Waiter_Subsystem1
{
public:
void writeOrder() { cout << " Waiter writes client's order\n";}
void sendToKitchen(){ cout << " Send order to kitchen\n";}
void serveCustomer(){ cout << " Yeeei customer is served!!!\n";}
};class Kitchen_Subsystem2
{
public:
void prepareFood(){ cout << " Cook food\n";}
void callWaiter() { cout << " Call Waiter\n";}
void washDishes() { cout << " Wash the dishes\n";}
};

Fachada: Neste exemplo, a classe Facade é sobre as encomendas de comida no restaurante. Para executar uma ordem de comida com sucesso, contamos com uma sequência específica de chamadas de método e uma chamada depende da anterior e assim por diante. A cozinha, não pode preparar a comida se o garçom não escrever o pedido e enviá-lo para a cozinha. A classe Facade fornece a tarefaorderFood ao cliente para simplificá-la e evitar qualquer mau uso devido à complexidade que existe.

class Order_Facade
{
private:
Waiter_Subsystem1waiter;
Kitchen_Subsystem2 kitchen;
public:
void orderFood()
{
cout << "A series of interdependent calls on various subsystems:\n";
waiter.writeOrder();
waiter.sendToKitchen();
kitchen.prepareFood();
kitchen.callWaiter();
waiter.serveCustomer();
kitchen.washDishes();
}
};

Função principal
A função principal funciona como o cliente(o mesmo que os guias anteriores). É tão fácil para o cliente poder criar uma instância Facade e chamar uma função para fazer seu trabalho.

int main(int argc, char *argv)
{
// Simple for the client
// no need to know the order or the
// dependencies among various subsystems.
Order_Facade facade;
facade.orderFood();return 0;
}// Output
// A series of interdependent calls on various subsystems:
// Waiter writes client's order
// Send order to kitchen
// Cook food
// Call Waiter
// Yeeei customer is served!!!
// Wash the dishes

Existem alguns benefícios para o uso do padrão Facade e alguns pontos a serem observados quando a Facade deve ser abordada.

  • Facade define uma interface de nível superior que torna o subsistema mais fácil de usar, embrulhando um subsistema complicado.
  • >

  • Esta reduz a curva de aprendizagem necessária para alavancar com sucesso o subsistema.
  • Também promove a separação do subsistema dos seus potenciais muitos clientes.
  • Por outro lado, se a Facade é o único ponto de acesso para o subsistema, ela limitará as características e flexibilidade que os “power users” podem precisar.

O próximo blog será um guia rápido para o padrão de design do Observer. É um padrão de comportamento que é um must have para o seu repositório de conhecimento. Não se esqueça de gostar/concentrar o meu blog-post e seguir a minha conta. Isto é para me dar a satisfação de ter ajudado alguns colegas desenvolvedores e me pressionar para continuar a escrever. Se existe um padrão de design específico que você gostaria de aprender, então me avise para que eu possa fornecê-lo para você no futuro.

Outros guias rápidos sobre padrões de design:

  1. Design Patterns – Um guia rápido para Abstract Factory.
  2. Design Patterns – Um guia rápido para Bridge Pattern.
  3. Design Patterns – Um guia rápido para o Builder Pattern.
  4. Design Patterns – Um guia rápido para o Decorator Pattern.
  5. Design Patterns – Um guia rápido para o Facade Pattern.
  6. Design Patterns – Um guia rápido para o Observer Pattern.
  7. Design Patterns – Um guia rápido para o Singleton Pattern.

Deixe uma resposta

O seu endereço de email não será publicado.