originalmente publicado em http://50minutos.com.br/blog
Definição:
É um padrão que cria uma interface simples, de alto nível, para interfaces complexas. Com isso a visão do usuário é de que a operação é simples, quando - na verdade - não o é.
Quando usar:
- Quando você tem uma biblioteca definida e apartada da aplicação client e não quer que a mesma acesse recursos específicos dentro dela;
- Quando você precisa simplificar uma sequência de passos mais complexa;
- Quando você quer ter diferentes interfaces com o usuário;
- Quando você precisa de um novo ponto de acesso a um recurso de um software em camadas.
Como usar:
- Criar uma classe static Facade;
- Criar campos estáticos do tipo de cada Subsystem de Library;
- Implementar as operações (Operation1, Operation2) de modo que ele execute métodos dos subsistemas (SubsystemA, SubsystemB e SubsystemC).
Exemplo:
using System;
using _50minutos_biblioteca;
namespace _50minutos_facade
{
class Program
{
static void Main(string[] args)
{
Homem.SacarDinheiro();
Console.ReadKey();
}
}
}
//Library
namespace _50minutos_biblioteca
{
//SubsystemA
internal class Pessoa
{
internal void Ir(String paraOnde)
{
Console.WriteLine("chegou: {0}", paraOnde);
}
internal void PassarCartao()
{
Console.WriteLine("passou o cartão");
}
internal void DigitarSenha()
{
Console.WriteLine("digitou a senha");
}
internal void PegarDinheiro()
{
Console.WriteLine("pegou o dinheiro");
}
}
//SubsystemB
internal class Carteira
{
internal void Abrir()
{
Console.WriteLine("carteira aberta");
}
internal void Fechar()
{
Console.WriteLine("carteira fechada");
}
internal void Pegar()
{
Console.WriteLine("carteira na mão");
}
internal void Guardar(String onde)
{
Console.WriteLine("carteira guardada: {0}", onde);
}
internal void PegarCartao(String qual)
{
Console.WriteLine("cartão na mão: {0}", qual);
}
internal void GuardarCartao()
{
Console.WriteLine("cartão na carteira");
}
}
//Facade
public static class Homem
{
//SubsystemA
static Carteira carteira = new Carteira();
//SubsystemB
static Pessoa pessoa = new Pessoa();
//Operation1
public static void SacarDinheiro()
{
pessoa.Ir("caixa eletrônico");
carteira.Abrir();
carteira.PegarCartao("débito");
pessoa.PassarCartao();
pessoa.DigitarSenha();
pessoa.PegarDinheiro();
carteira.GuardarCartao();
carteira.Guardar("bolso");
pessoa.Ir("casa");
}
}
}