Reaprendendo padrões de design (3. Padrões de design - padrões de estratégia)

1. Modo de estratégia

    Estratégias, que se referem a estratégias ou estratégias, são uma coleção de planos que podem atingir metas. Na verdade, esse tipo de problema é bastante comum no nosso dia a dia, por exemplo, usamos o mapa para buscar destinos, e o mapa nos dá várias opções de rotas para escolhermos. O plano de rota aqui é realmente a nossa estratégia. A implementação de cada plano é um algoritmo. O plano de rota específico a ser usado precisa ser determinado de acordo com a situação real e a escolha do usuário.

    Anteriormente, falamos sobre métodos de modelo, que são baseados em herança e permitem alterar partes do algoritmo estendendo essas partes em subclasses. O padrão de estratégia é baseado na combinação, que pode mudar parte do comportamento do objeto, fornecendo ao objeto diferentes estratégias correspondentes ao comportamento. O método template é aplicado no nível da classe e é estático, enquanto o padrão strategy funciona no nível do objeto, permitindo que você alterne o comportamento em tempo de execução.

1.1, qual é o padrão de estratégia

  • definição

    O padrão de estratégia é um padrão de design comportamental que permite definir uma série de algoritmos e extrair cada algoritmo em uma classe separada chamada estratégia, que é chamada pelo cliente para escolher, para que possam ser substituídos entre si, e a alteração do algoritmo não afetará o cliente que usa o algoritmo.

A estrutura do padrão de estratégia:

    1) Classe de estratégia abstrata (Strategy): define uma interface pública, e vários algoritmos implementam essa interface de maneiras diferentes;

    2) Classe de estratégia concreta: implementa a interface definida pela estratégia abstrata e fornece implementação de algoritmo específico;

    3) Classe de ambiente (contexto): contém uma referência a uma classe de estratégia e finalmente a chama para o cliente.

    A intenção do padrão de estratégia é separar algoritmos e escolher implementações. Ou seja, os métodos intercambiáveis ​​são encapsulados em suas próprias classes independentes para facilitar a substituição de algoritmos ou a adição de novos algoritmos. 

1.2. Vantagens e desvantagens do modo de estratégia

  • vantagem

    1) Os detalhes de implementação do algoritmo são isolados do cliente, e diferentes algoritmos podem ser selecionados de acordo com a situação real em tempo de execução;

    2) Está em conformidade com o princípio de abertura e fechamento e pode adicionar novos algoritmos de forma flexível sem modificar o código original.

  • deficiência

    1) O cliente deve entender as diferenças entre as estratégias para escolher a estratégia adequada;

    2) Algoritmos diferentes podem ser implementados em classes/funções anônimas, e não há necessidade de adicionar classes ou interfaces adicionais para tornar o código inchado.

1.3. Método de criação

    Tomando como exemplo ir ao parque, existem muitas maneiras de ir ao parque.

1) Aula de estratégia abstrata

//抽象策略(Strategy)类
public interface Strategy {

	void goToPark(); //去公园
}

2) Aula de estratégia concreta

//具体策略(Concrete Strategy)类
public class BySubwayStrategy implements Strategy{

	@Override
	public void goToPark() {
		System.out.println("乘地铁去公园");
	}

}

//具体策略(Concrete Strategy)类
public class ByBusStrategy implements Strategy{

	@Override
	public void goToPark() {
		System.out.println("乘公交去公园");
	}

}

//具体策略(Concrete Strategy)类
public class ByTaxiStrategy implements Strategy{

	@Override
	public void goToPark() {
		System.out.println("打车去公园");
	}

}

3) Categoria de ambiente

//负责和具体的策略类交互,使得算法和客户端分离
public class Context {
	private Strategy strategy; //当前采用的具体对象,即具体的算法对象
	
	//支持使用构造注入
	public Context(Strategy strategy){
		this.strategy = strategy;
	}
	
	//也可以通过set注入
	public void setStrategy(Strategy strategy){
		this.strategy = strategy;
	}
	
	public void goToPark(){
		this.strategy.goToPark();
	}
	
}

4) cliente

public class Client {

	public static void main(String[] args) {
		Strategy bySubway = new BySubwayStrategy();
		//乘地铁
		Context ctx = new Context(bySubway);
		ctx.goToPark();
		//乘公交
		Strategy byBus = new ByBusStrategy();
		ctx.setStrategy(byBus);
		ctx.goToPark();
		//打车
		Strategy byTaxi = new ByTaxiStrategy();
		ctx.setStrategy(byTaxi);
		ctx.goToPark();
	}
}

O diagrama UML neste momento:

1.4. Resumo e Sugestões

    O padrão Strategy é muito comum no código Java. É frequentemente usado em várias estruturas para fornecer uma maneira de os usuários alterarem o comportamento de uma classe sem estendê-la e geralmente descreve maneiras diferentes de fazer a mesma coisa, permitindo que você troque esses algoritmos em uma única classe de contexto.

    Essa maneira de escrever é um pouco como a nossa maneira de escrever no modo decorador, mas o decorador é mais como uma decoração por fora, e o modo estratégia é uma mudança interna completa.

Cenário de aplicação:

    1) Use o padrão de estratégia quando houver muitas classes semelhantes que diferem apenas na forma como executam determinados comportamentos;

    2) Quando há um grande número de declarações condicionais alternando entre diferentes variantes do mesmo algoritmo, essa condição pode ser eliminada movendo cada ramificação condicional para sua respectiva classe de estratégia em vez dessas declarações condicionais.

Aplicação do modo de estratégia no JDK:

    java.util.Comparator#compare()Collections#sort()

    método javax.servlet.http.HttpServlet:service()

    javax.servlet.Filter#doFilter()

Acho que você gosta

Origin blog.csdn.net/xiaoxianer321/article/details/125570710
Recomendado
Clasificación