originalmente publicado em http://50minutos.com.br/blog

No post Um pattern em C# por dia: Façade - pattern estrutural eu mostrei um exemplo. Aqui vai mais um:



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using _50minutos_biblioteca;

using System.Threading;



namespace _50minutos_facade

{

    class Program

    {

        static void Main(string[] args)

        {

            Sala s = new Sala();



            s.Abrir();



            Console.WriteLine("------------------------");

            Console.WriteLine("a aula está em andamento");

            Console.WriteLine("  a g u a r d e  . . .");

            Console.WriteLine("------------------------");



            Thread.Sleep(5000);



            s.Fechar();



            Console.ReadKey();

        }

    }

}



//Library

namespace _50minutos_biblioteca

{

    //SubsystemA

    internal class SalaTreinamento

    {

        internal void AcenderLuzes()

        {

            Console.WriteLine("sala de treinamento - luzes acesas");

        }



        internal void ApagarLuzes()

        {

            Console.WriteLine("sala de treinamento - luzes apagadas");

        }



        internal void Abrir()

        {

            Console.WriteLine("sala de treinamento aberta");

        }



        internal void Fechar()

        {

            Console.WriteLine("sala de treinamento fechada");

        }

    }



    //SubsystemB

    internal class Projetor

    {

        internal void Ligar()

        {

            Console.WriteLine("projetor ligado");

        }



        internal void Desligar()

        {

            Console.WriteLine("projetor desligado");

        }

    }



    //SubsystemC

    internal class Computador

    {

        internal void Ligar()

        {

            Console.WriteLine("computador ligado");

        }



        internal void Desligar()

        {

            Console.WriteLine("computador desligado");

        }

    }



    //Facade

    public class Sala

    {

        //SubsystemA

        SalaTreinamento s = 

            new SalaTreinamento();



        //SubsystemB

        Projetor p =

            new Projetor();



        //SubsystemC

        Computador[] ac = 

            new Computador[10];



        public Sala()

        {

            for (int i = 0; i < ac.Length; i++)

            {

                ac[i] = new Computador();

            }

        }



        //Operation1

        public void Abrir()

        {

            s.Abrir();

            s.AcenderLuzes();

            p.Ligar();



            foreach (var item in ac)

            {

                item.Ligar();

            }

        }



        //Operation2

        public void Fechar()

        {

            foreach (var item in ac)

            {

                item.Desligar();

            }



            p.Desligar();

            s.ApagarLuzes();

            s.Fechar();

        }

    }

}