Strategy

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

Strategy é um padrão de projeto de software (do inglês design pattern). O objetivo é representar uma operação a ser realizada sobre os elementos de uma estrutura de objetos. O padrão Strategy permite definir novas operações sem alterar as classes dos elementos sobre os quais opera. Definir uma família de algoritmos e encapsular cada algoritmo como uma classe, permitindo assim que elas possam ser trocados entre si. Este padrão permite que o algoritmo possa variar independentemente dos clientes que o utilizam.

Aplicação[editar | editar código-fonte]

Utilizar o padrão Strategy quando:

•um objeto deve ser parametrizado com um de vários algoritmos, os quais podem ser encapsulados e representados por uma única interface.

Ícone de esboço Este artigo sobre programação de computadores é um esboço. Você pode ajudar a Wikipédia expandindo-o.


Segue um exemplo em Java onde o valor de comissão difere de acordo com o cargo do funcionario.

    /** 
     * Interface pattern Strategy.
     */
    public interface Strategy {
 
        // Calcula comissão.
        double calcularComissao(double valorVenda);
    }


    /** 
     * Enumeration de cargos. 
     * Cada classe da enumeração define uma das estratégias possíveis de comissão
     */
    public enum Cargo implements Strategy{
        ATENDENTE {
            @Override
            public double calcularComissao(double valorVenda) {
                return (valorVenda * 0.01);                            
            }
        },
        VENDEDOR {
            @Override
            public double calcularComissao(double valorVenda) {
                return (valorVenda * 0.02);                            
            }
        },
        GERENTE {
            @Override
            public double calcularComissao(double valorVenda) {
                return (100 + valorVenda * 0.03);                            
            }
        };
    }


    /**
     * Dados do funcionario.
     */
    public class Funcionario {
        private long id;
        private Cargo cargo;
        // Construtor, getters e setters
        . . .
    }


    /**
     * Classe que calcula comissão de venda.
     */
    public class Venda {
 
        private double valorVenda;
        private Funcionario funcionario;        
 
        //Gets e setters 
 
        public void save() {
            /* 
             * Calcula o valor da comissão de venda sem que haja a necessidade de
             * usar um switch para o tipo de cargo toda vez que o método <b>save</b> for executado. 
             */
            final double valorComissao = this.funcionario.getCargo().calcularComissao(this.valorVenda);
            // . . .
        }
    }