Definição
Use strategy pattern quando você precisa definir uma família de algoritmos, encapsular cada um, e torná-los intercambiáveis. Strategy permite que o algoritmo varie independentemente dos clientes que o utilizam. Padrões relacionados incluem State, Flyweight, Decorador, Composite.
Use strategy pattern quando você precisa definir uma família de algoritmos, encapsular cada um, e torná-los intercambiáveis. Strategy permite que o algoritmo varie independentemente dos clientes que o utilizam. Padrões relacionados incluem State, Flyweight, Decorador, Composite.
Quando usar
• Quando você precisa usar um dos vários algoritmos de forma dinâmica.
• Quando você desejar configurar uma classe com uma das muitas classes relacionadas(Comportamentos).
• Quando um algoritmo usa dados que os clientes não devem conhecer.
Benefícios
• Reduz a várias instruções condicionais em um cliente.
• Oculta os dados complexos, algorítmos específicos do cliente.
• Oferece uma alternativa à herança.
• Pode ser utilizado para ocultar dados que usa um algoritmo que os clientes não devem saber.
Desvantagens / consequências
• Os clientes devem estar cientes das diferentes estratégias. Um cliente deve entender como as estratégias diferem antes que ele possa escolher a mais apropriada.
• Aumenta o número de objetos em um aplicativo.
Exemplo
Este exemplo usa algoritmos de ordenação. Dois algoritmos de classificação (uma espécie de bolha e Quick sort) são implementados e o cliente pode escolher qualquer um dos algoritmos. O SortInterface descreve o que os algoritmos devem ser capazes de fazer, sort (). Tanto a classe QuickSort quanto BubbleSort implementam a SortInterface e cada um tem seu próprio algoritmo para a classificação. SortingContext mantém uma referência a um objeto de Strategy e encaminha as solicitações do cliente para strategy. SortingClient define a strategy concreta no context e invoca a Context para executar o algoritmo.
public interface SortInterface {
public void sort(double[] list);
}
public class QuickSort implements SortInterface {
public void sort(double[] u) {
sort(u, 0, u.length - 1);
}
private void sort(double[] a, int left, int right) {
if (right <= left) return;
int i = part(a, left, right);
sort(a, left, i-1);
sort(a, i+1, right);
}
private int part(double[] a, int left, int right) {
int i = left;
int j = right;
while (true) {
while (a[i]< a[right])
i++;
while (smaller(a[right], a[--j]))
if (j == left) break;
if (i >= j) break;
swap(a, i, j);
}
swap(a, i, right);
return i;
}
private boolean smaller(double x, double y) {
return (x < y);
}
private void swap(double[] a, int i, int j) {
double swap = a[i]; a[i] = a[j]; a[j] = swap;
}
}
public class BubbleSort implements SortInterface {
public void sort(double[] list) {
//Bubblesort algorithm here
}
}
public class SortingContext {
private SortInterface sorter = null;
public void sortDouble(double[] list) {
sorter.sort(list);
}
public SortInterface getSorter() {
return sorter;
}
public void setSorter(SortInterface sorter) {
this.sorter = sorter;
}
}
public class SortingClient {
public static void main(String[] args) {
double[] list = {1,2.4,7.9,3.2,1.2,0.2,10.2,
22.5,19.6,14,12,16,17};
SortingContext context = new SortingContext();
context.setSorter(new QuickSort());
context.sortDouble(list);
for(int i =0; i< list.length; i++) {
System.out.println(list[i]);
}
}
}
Quando SortingClient é executado o resultado é:
0.2
1.0
1.2
2.4
3.2
7.9
10.2
12.0
14.0
16.0
17.0
19.6
22.5
Exemplo de uso
O Strategy pattern é usado na implementação do LayoutManager em
Java. O LayoutManager pode ser configurado para trabalhar com layout diferente dos objetos, tais como FlowLayout, CardLayout GridLayout, etc. Essas classes encapsulam os algoritmos reais para o layout de componentes visuais que a LayoutManager usa para processar a interface na tela. Ao mudar o Layout (algoritmo), pode ser alterado dinamicamente como a interface é
prestados.
O Strategy pattern é usado na implementação do LayoutManager em
Java. O LayoutManager pode ser configurado para trabalhar com layout diferente dos objetos, tais como FlowLayout, CardLayout GridLayout, etc. Essas classes encapsulam os algoritmos reais para o layout de componentes visuais que a LayoutManager usa para processar a interface na tela. Ao mudar o Layout (algoritmo), pode ser alterado dinamicamente como a interface é
prestados.
Nenhum comentário:
Postar um comentário