C# - O Padrão Strategy (revisitado)

 Neste artigo vamos recordar o padrão Strategy e uma aplicação prática bem simples mostrando sua utilização.

Vamos começar com a definição clássica:

"O padrão Strategy define uma família de algoritmos , encapsula cada um deles , e torna-os intercambiáveis, permitindo assim que os algoritmos variem independentemente dos clientes que os utilizam"

na verdade isso significa que :

"O padrão Strategy define uma familia de algoritmos intercambiáveis de forma que estes sejam independentes dos clientes que os utilizam. "

Ou tentando ser mais objetivo :

Objetivo: Encapsular um algoritmo em um objeto e fornecer interfaces genéricas o suficiente para suportar uma variedade de algorítmos e facilitar a escolha e troca (intercâmbio) de algoritmos criados com uma mesma função.

O pulo do gato para usar o padrão Strategy é perceber o que pode mudar no seu código e encapsular.

Vejamos alguns cenários onde o padrão pode ser aplicado:

O esquema UML do padrão pode ser visto abaixo:

Strategy - Interface comum para todas as classes (variações concretas) que definem os diversos comportamentos esperados;

ConcreteStrategy - Classes que implementam os algoritmos que devem atender a cada contexto;

Context - Classe onde os objetos ConcreteStrategy serão instanciados;

Aplicando o padrão Strategy - Calculadora Estratégica

Vamos agora aplicar o padrão Strategy e definir um programa que realize as quatro operações básicas: somar, subtrair, dividir e multiplar.

Crie um projeto do tipo Console App (.NET Framework) no VS 2017 Community.

1- Definindo o Context - A classe onde os objetos concretos serão instanciados

2- Definindo a Strategy - A interface comum para todas as classes que define o comportamento esperado:

3- Definindo a ConcreteStrategy - As classes que implementam os algoritmos que atendem a cada contexto:

No método Main() inclua o código para que o usuário informe os valores e as opções para escolher qual operação deseja realizar:

static void Main(string[] args)
        {
            Calcular calculadora = new Calcular();
            while(true)
            {
                Console.WriteLine("Informe o primeiro valor");
                double valor1 = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("Informe o segundo valor");
                double valor2 = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("-------------------------------");
                Console.WriteLine("1 - Somar");
                Console.WriteLine("2 - Subtrair");
                Console.WriteLine("3 - Dividir");
                Console.WriteLine("4 - Multiplicar");
                string opcao = Console.ReadLine();
                if(opcao=="1")
                {
                    calculadora.calcular = new Somar();
                    calculadora.CalcularOperacao(valor1, valor2);
                }
                if (opcao == "2")
                {
                    try
                    {
                        calculadora.calcular = new Subtrair();
                        calculadora.CalcularOperacao(valor1, valor2);
                    }
                    catch
                    {
                        Console.WriteLine("Erro na operacao");
                    }
                }
                if(opcao=="3")
                {
                    try
                    {
                        calculadora.calcular = new Dividir();
                        calculadora.CalcularOperacao(valor1, valor2);
                    }
                    catch (Exception ex)
                    {

                        Console.WriteLine("Erro na operacao : " + ex.InnerException);
                    }
                }
                if (opcao == "4")
                {
                    calculadora.calcular = new Multiplicar();
                    calculadora.CalcularOperacao(valor1, valor2);
                }
            }
        }
    }

Em cada opção crie uma instância da classe Calcular() que é o usuário do algoritmo que é intercambiável.

 Calcular calculadora = new Calcular();

E use a propriedade Calculadora desta classe para ser configurada em tempo de execução de acordo com o algorítmo necessário para realizar a operação escolhida:

  calculadora.calcular = new Algoritmo();

A final invoque o método CalcularOperacao() passando os valores informados pelo usuário que os aplicará ao respectivo algorítmo retornando o valor.

Executando o projeto teremos:



Assim, o padrão Strategy te conduz a seguinte orientação:

1 - Programe sempre para interfaces;
2 - Dê preferência a composição ao invés de herança;

Pegue o código completo aqui:  Calc_Strategy.zip

(disse Jesus) - "E a vida eterna é esta: que te conheçam, a ti só, por único Deus verdadeiro, e a Jesus Cristo, a quem enviaste."
João 17:3

 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti