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 ter trocados entre si. Este padrão permite que o algoritmo possa variar independentemente dos clientes que o utilizam.

[editar] Aplicação

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 é 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.

    /** 
     * Enumeration de cargos. 
     */
    public enum Cargo {
        ATENDENTE,
        VENDEDOR,
        GERENTE;
    }


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


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


    /**
     * Classe que calcula comissão de venda.
     */
    public class Venda {
 
        private double valorVenda;
        private Funcionario funcionario;
        private Strategy calculoComissao;
 
        // Construtor [Implementa STRATEGY].
        public Venda() {
 
            switch (funcionario.getCargo()) {
 
                case ATENDENTE :
 
                    this.setCalculoComissao(new Strategy() {
 
                        @Override
                        public double calcularComissao(double valorVenda) {
                            return (valorVenda * 0.01);                            
                        }
                    });
                    break;
 
                case VENDEDOR :
 
                    this.setCalculoComissao(new Strategy() {
 
                        @Override
                        public double calcularComissao(double valorVenda) {
                            return (valorVenda * 0.02);                            
                        }
                    });
                    break;
 
                case GERENTE :
 
                    this.setCalculoComissao(new Strategy() {
 
                        @Override
                        public double calcularComissao(double valorVenda) {
                            return (valorVenda * 0.03);                            
                        }
                    });
                    break;
            }
        }
 
        private void setCalculoComissao(Strategy calculoComissao) {
            this.calculoComissao= calculoComissao;
        }
 
        private Strategy getCalculoComissao() {
            return (this.calculoComissao);
        }
 
        public void save() {
 
            //. . .
 
            /* 
             * Calcula o valor da comissão de venda sem que haja a necessidade de
             * verificar qual o tipo cargo toda vez que o metodo <b>save</b> for executado. 
             */
            final double valorComissao = this.getCalculoComissao().calcularComissao(this.valorVenda);
 
            // . . .
        }
    }
}


Ferramentas pessoais
Espaços nominais

Variantes
Ações
Navegação
Colaboração
Imprimir/exportar
Ferramentas
Noutras línguas