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

Definição:

É um padrão que nos permite separar a implementação da abstração.

Quando usar:

  • Quando queremos ocultar do cliente a implementação;
  • Quando queremos evitar o vínculo (p.e. herança) entre a abstração e a implementação;
  • Quando queremos alterar a implementação sem recompilar a abstração.
padrão brigde

Como usar:

  • Criar as implementações (ImplementationA e ImplementationB) que implementem Bridge;
  • Criar uma classeAbstraction;
  • Adicionar um campo privado do tipo Bridge;
  • Adicionar um construtor que receba umBridge e o atribua ao campo privado;
  • ImplementarOperation de acordo com a sua necessidade, chamando os métodos OperationImp de ImplementationAou ImplementationB.

Exemplo 01:

using System;

 namespace _50minutos_bridge
{
    class Program
    {
        static void Main(string[] args)
        {
            CalculadoraFramework cf;
            cf = new CalculadoraFramework();
           
            CalculadoraJohnWallis jw;
            jw = new CalculadoraJohnWallis();
            
            CalculadoraLeibniz lz;
            lz = new CalculadoraLeibniz();

             Console.WriteLine("constante do framework");
            Console.WriteLine("\tPI: {0}\n", 
                new Calculadora(cf).PI);

             Console.WriteLine("algoritmo de John Wallis");
            Console.WriteLine("\tPI: {0}\n", 
                new Calculadora(jw).PI);

             Console.WriteLine("algoritmo de Leibniz");
            Console.WriteLine("\tPI: {0}\n", 
                new Calculadora(lz).PI);

             Console.ReadKey();
        }
    }

     //Bridge
    interface ICalculadora
    {
        //OperationImp
        double PI { get; }
    }

     //ImplementationA
    class CalculadoraFramework : ICalculadora
    {
        //retorna a constante PI da classe Math

         //OperationImp
        public double PI { get { return Math.PI; } }
    }

     //ImplementationB
    class CalculadoraJohnWallis : ICalculadora
    {
        //OperationImp
        public double PI
        {
            get
            {
                double pi = 1;

                 for (int i = 1; i <= 100000; i++)
                {
                    double numero = i * 2;
                    pi *= numero / (numero - 1);
                    pi *= numero / (numero + 1);
                }

                 return 2 * pi;
            }
        }
    }

     //ImplementationX
    class CalculadoraLeibniz : ICalculadora
    {
        //OperationImp
        public double PI
        {
            get
            {
                double pi = 0;

                 for (int i = 1; i <= 400000; i += 4)
                {
                    pi = pi + 1.0 / i - 1.0 / (i + 2);
                }

                 return 4 * pi;
            }
        }
    }

     //Abstraction
    class Calculadora
    {
        //bridge
        ICalculadora c;

         public Calculadora(ICalculadora c)
        {
            this.c = c;
        }

         //Operation
        public double PI
        {
            get
            {
                return c.PI;
            }
        }
    }
}

Exemplo 02:

using System;

 namespace _50minutos_bridge
{
    class Program
    {
        static void Main(string[] args)
        {
            //usando Generic

             Console.WriteLine("constante do framework");
            Console.WriteLine("\tPI: {0}\n", 
                new Calculadora().PI);

             Console.WriteLine("algoritmo de John Wallis");
            Console.WriteLine("\tPI: {0}\n", 
                new Calculadora().PI);

             Console.WriteLine("algoritmo de Leibniz");
            Console.WriteLine("\tPI: {0}\n", 
                new Calculadora().PI);

             Console.ReadKey();
        }
    }

     //Bridge
    interface ICalculadora
    {
        //OperationImp
        double PI { get; }
    }

     //ImplementationA
    class CalculadoraFramework : ICalculadora
    {
        //retorna a constante PI da classe Math

         //OperationImp
        public double PI { get { return Math.PI; } }
    }

     //ImplementationB
    class CalculadoraJohnWallis : ICalculadora
    {
        //OperationImp
        public double PI
        {
            get
            {
                double pi = 1;

                 for (int i = 1; i <= 100000; i++)
                {
                    double numero = i * 2;
                    pi *= numero / (numero - 1);
                    pi *= numero / (numero + 1);
                }

                 return 2 * pi;
            }
        }
    }

     //ImplementationX
    class CalculadoraLeibniz : ICalculadora
    {
        //OperationImp
        public double PI
        {
            get
            {
                double pi = 0;

                 for (int i = 1; i <= 400000; i += 4)
                {
                    pi = pi + 1.0 / i - 1.0 / (i + 2);
                }

                 return 4 * pi;
            }
        }
    }

     //Abstraction usando Generic
    class Calculadora where T: ICalculadora, new()
    {
        //Operation
        public double PI
        {
            get
            {
                //bridge >>> new T()
                return new T().PI;
            }
        }
    }
}