Resumo : neste tutorial, você aprenderá sobre o padrão C# Bridge que separa uma abstração de sua implementação para que as duas possam variar independentemente.
Introdução ao padrão C# Bridge
Por definição, um padrão Bridge permite dissociar uma abstração de sua implementação para que você possa alterar as duas independentemente.
Suponha que você tenha a seguinte hierarquia de classes de forma:
Para tornar triângulos e retângulos arredondados e esboçados, você pode acabar com as subclasses das classes Triangle
e Rectangle
assim:
Mas esta abordagem não é flexível porque a herança vincula permanentemente um estilo (implementação) a uma forma (abstração).
Por exemplo, se quiser adicionar uma nova forma como um pentágono, você precisa definir três classes Pentagon
,, RoundedPentagon
e SketchedPentagon
.
Além disso, se quiser adicionar um estilo de forma mais como em relevo, você precisará adicionar uma nova classe a cada forma, o que não é bem dimensionado.
Para resolver esse problema, você pode usar o padrão Bridge para separar o estilo da hierarquia de formas assim:
Implementação do padrão C# Bridge
O programa a seguir ilustra o padrão de ponte:
using static System.Console;
namespace BridgePattern;
public abstract class Style
{
public abstract void Decorate();
}
public class RoundedStyle : Style
{
public override void Decorate() => WriteLine("rounded.");
}
public class SketchedStyle : Style
{
public override void Decorate() => WriteLine("sketched.");
}
public abstract class Shape
{
protected Style Style;
public Shape(Style style)
{
Style = style;
}
public abstract void ApplyStyle();
}
public class Triangle : Shape
{
public Triangle(Style style) : base(style)
{
}
public override void ApplyStyle()
{
Write("Make the triangle ");
Style.Decorate();
}
}
public class Rectangle : Shape
{
public Rectangle(Style style) : base(style)
{
}
public override void ApplyStyle()
{
Write("Make the rectangle ");
Style.Decorate();
}
}
public class Program
{
public static void Main(string[] args)
{
var triangle = new Triangle(new SketchedStyle());
triangle.ApplyStyle();
var rectangle = new Rectangle(new RoundedStyle());
rectangle.ApplyStyle();
}
}
Linguagem de código: C# ( cs )
Saída:
Make the triangle sketched.
Make the rectangle rounded.
Como funciona.
Primeiro, defina a Style
classe abstrata que possui o Decorate()
método abstrato:
public abstract class Style
{
public abstract void Decorate();
}
Linguagem de código: C# ( cs )
Segundo, defina a RoundedStyle
classe que herda da Style
classe. O Decorate()
método exibe a " rounded."
mensagem para o Console:
public class RoundedStyle : Style
{
public override void Decorate() => WriteLine("rounded.");
}
Linguagem de código: C# ( cs )
Terceiro, defina a SketchedStyle
classe que também herda da Style
classe. O Decorate()
método mostra a " sketched."
mensagem para o Console:
public class SketchedStyle : Style
{
public override void Decorate() => WriteLine("sketched.");
}
Linguagem de código: C# ( cs )
Quarto, defina a Shape
classe abstrata que possui um Style
objeto como propriedade e um método abstrato ApplyStyle()
que chama o Decorate()
método do Style
objeto para definir o estilo da forma:
public abstract class Shape
{
protected Style Style;
public Shape(Style style)
{
Style = style;
}
public abstract void ApplyStyle();
}
Linguagem de código: C# ( cs )
Quinto, defina a Triangle
classe que estende a Shape
classe. O ApplyStyle()
método grava uma mensagem no console e chama o Decorate()
método do objeto de estilo:
public class Triangle : Shape
{
public Triangle(Style style) : base(style)
{
}
public override void ApplyStyle()
{
Write("Make the triangle ");
Style.Decorate();
}
}
Linguagem de código: C# ( cs )
Sexto, defina a Rectangle
classe que herda da Shape
classe. O ApplyStyle()
método também grava uma mensagem no console e chama o Decorate()
método do Style
objeto:
public class Rectangle : Shape
{
public Rectangle(Style style) : base(style)
{
}
public override void ApplyStyle()
{
Write("Make the rectangle ");
Style.Decorate();
}
}
Linguagem de código: C# ( cs )
Por fim, crie uma instância da Triangle
classe com SketchedStyle
e chame o
método para definir seu estilo como esboço. Da mesma forma, crie uma instância da ApplyStyle()
Rectangle
classe e chame o
método para definir seu estilo como arredondado.ApplyStyle()
public class Program
{
public static void Main(string[] args)
{
var triangle = new Triangle(new SketchedStyle());
triangle.ApplyStyle();
var rectangle = new Rectangle(new RoundedStyle());
rectangle.ApplyStyle();
}
}
Linguagem de código: C# ( cs )
Resumo
- Use o padrão C# Bridge para dissociar uma abstração de sua implementação para que as duas possam variar independentemente.