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.
padrão facade

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