Você está na página 1de 7

FACULDADE CENECISTA DE SETE LAGOAS

WANDER GONALVES VIEIRA

PADRES DE PROJETO
PADRO STRATEGY

Sete Lagoas
Junho/2013

Conceito:
O padro Strategyserve para definir uma famlia de algoritmos, encapsular
cada uma delas e torn-las intercambiveis. Strategy permite que o
algoritmo varie independentemente dos clientes que o utilizam.
Encapsula estratgias alternativas, ou abordagens, em classes separadas,
cada uma das quais implementandoumaoperao comum.
Tambm conhecido por Policy.

Caractersticas:
Inteno: Permite utilizar regras de negcio ou algoritmos diferentes,
dependendo do contexto em que eles ocorram;
Problema: A seleo de um algoritmo que precisa ser aplicado
depende do cliente que faz a solicitao ou dos dados que esto
sendo operados. Se h um uma regra que simplesmente no mude,
no h necessidade de usar um padro Strategy.
Soluo: Separa a seleo de algoritmos da implementao destes.
Permite que a seleo seja feita com base no contexto.
Participante e colaboradores:
O Strategy especifica como diferentes algoritmos so utilizados.
As classes EstratgiasConcretas implementam esses diferentes
algoritmos.
A classe Contexto usa a EstratgiasConcreta especfica com
uma
referncia do tipo Strategy. As classes Strategy e Contexto
interagem para implementar o algoritmo escolhido (algumas vezes a
classe Strategy deve questionar Contexto). A classe Contexto
repassa pedidos do seu cliente para Strategy.
Consequncias:
O padro Strategy define uma famlia de algoritmos.
Os comandos switch e/ou outras condies podero ser eliminados.
Podem-se invocar todos os algoritmos da mesma maneira (eles
todos devem ter a mesma interface).
Fazer com que a classe que utilizado o algoritmo (a Contexto)
contenha a classe abstrata (a Strategy) que, por sua parte, disponha

de um mtodo abstrato que especifique o modo como chamar o


algoritmo. Cada classe derivada implementa conforme necessrio.

O padro Strategy pode ser utilizado quando se tem as seguintes


situaes:
Quando muitas
comportamento;

classes

relacionadas

diferem

apenas

no

seu

Quando necessita-se de variantes de um algoritmo;


Quando se precisa ocultar do usurio a exposio das estruturas de
dados complexas, especficas do algoritmo;
Quando uma classe define muitos comportamentos e por sua vez
eles aparecem como diversos IFs. Com isso esses comandos
condicionais so movidos para sua prpria classe Strategy.

VANTAGENS
Problema a ser resolvido:
Ao cadastrar um produto no sistema necessrio informar o nome evalor
do mesmo. Aps o cadastro, o sistema calcula o valor final de umproduto
de acordo com uma promoo existente, por exemplo, se umapromoo
de pscoa foi definida os produtos recebero um desconto de10%. Dessa
forma ser possvel definir diversas estratgias de promoopara os
produtos de acordo com uma data especial.

Inicialmente poderamos fazer um algoritmo em que realiza diversas


comparaes de acordo com o perodo da promoo para que possa
efetuar os clculos do valor do produto com o desconto com o perodo em
questo.
Podemos utilizar o Padro Strategy conforme o diagrama abaixo:

Classe Strategy
packagebr.edu.fcsl.strategy;
publicabstractinterfaceCalculaDesconto {
doublecalculaValorDesconto(double valor);
}

Classe Contexto
packagebr.edu.fcsl.strategy;
importbr.edu.fcsl.concreta.PromooCarnaval;
importbr.edu.fcsl.concreta.PromooNatal;
importbr.edu.fcsl.concreta.PromooPscoa;
public class Produto {
private String nome;
private double valor;
private String texto;
public String getTexto() {
returntexto;
}
public void setTexto(String texto) {
this.texto = texto;
}
public String getNome() {
returnnome;
}
public void setNome(String nome) {
this.nome = nome;
}
public void setValor(double valor) {
this.valor = valor;
}
public double getValor() {
return valor;
}
publicvoidinserirDados() {
setNome(nome);
setValor(valor);
}

publicStringexibirNovoValor() {
PromooNatal natal = new PromooNatal();
PromooCarnaval carnaval = new PromooCarnaval();
PromooPscoa pscoa = new PromooPscoa();

texto = "Nome do produto: " + nome + "\n" + "Valor: R$ "


+ valor
+
"\n========================================" + "\n"
+ "Promoo de Natal (30% de desconto): R$ "
+ natal.calculaValorDesconto(valor)
+
"\n========================================" + "\n"
+ "Promoo de Carnaval (15% de desconto):
R$ "
+ carnaval.calculaValorDesconto(valor)
+
"\n========================================" + "\n"
+ "Promoo de Pscoa (10% de desconto):
R$ "
+ pscoa.calculaValorDesconto(valor);
return texto;
}

Classes Concretas
packagebr.edu.fcsl.concreta;
importbr.edu.fcsl.strategy.CalculaDesconto;
publicclassPromooNatalimplementsCalculaDesconto{

publicdoublecalculaValorDesconto(double valor) {
return valor*0.70;
}
}
packagebr.edu.fcsl.concreta;
importbr.edu.fcsl.strategy.CalculaDesconto;
publicclassPromooCarnavalimplementsCalculaDesconto{
publicdoublecalculaValorDesconto(double valor) {
return valor*0.85;
}
}

packagebr.edu.fcsl.concreta;
importbr.edu.fcsl.strategy.CalculaDesconto;
publicclassPromooPscoaimplementsCalculaDesconto{
publicdoublecalculaValorDesconto(double valor) {
return valor*0.90;
}
}
Classe main
packagebr.edu.fcsl.Principal;
public class teste {
public static void main(String[] args) {
Produto p = new Produto();
p.setNome(Use a Cabea);
p.setValor(100.00);
System.out.println(p.exibirNovoValor());
}
}

Vantagens:

Famlias de algoritmos relacionados;


Alternativa ao uso de subclasses;
Elimina comandos condicionais;
Facilidade na escolha entre diferentes implementaes;
Facilita a manuteno;
Facilidade de entendimento da regra de negcio.

Referncias:
Use a cabea! Padres de projetos (Design Patterns);
Padres de Projeto: Solues Reutilizveis de Software Orientado a
Objetos;
http://www.devmedia.com.br/strategy-design-patterns/18839;
http://alfonseca.wordpress.com
http://www.macoratti.net/08/08/net_stgy.htm

Você também pode gostar