Padrão de ponte C#

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:

Padrão de ponte C# - hierarquia de formas

Para tornar triângulos e retângulos arredondados e esboçados, você pode acabar com as subclasses das classes Trianglee Rectangleassim:

Padrão de ponte C# - Explosão de hierarquia de formas

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,, RoundedPentagone 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:

Padrão de ponte C#

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 RoundedStyleclasse que herda da Styleclasse. 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 SketchedStyleclasse que também herda da Styleclasse. 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 Shapeclasse abstrata que possui um Styleobjeto como propriedade e um método abstrato ApplyStyle()que chama o Decorate()método do Styleobjeto 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 Triangleclasse que estende a Shapeclasse. 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 Rectangleclasse que herda da Shapeclasse. O ApplyStyle()método também grava uma mensagem no console e chama o Decorate()método do Styleobjeto:

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 Triangleclasse com SketchedStylee chame o ApplyStyle()método para definir seu estilo como esboço. Da mesma forma, crie uma instância da Rectangleclasse e chame o ApplyStyle()método para definir seu estilo como arredondado.

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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *