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.
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;
}
}
}
}