Padrão de Design (22) Padrão de Estratégia

Padrão de Estratégia

1. Qual é o modo de estratégia

Padrão de estratégia: define uma série de classes de algoritmos, encapsula cada algoritmo e permite que sejam substituídos entre si. O padrão de estratégia permite que o algoritmo mude independentemente dos clientes que o utilizam. Também é chamado de padrão de política (Política) .
O modo de estratégia é um modo de comportamento do objeto.

O objetivo principal do modo de estratégia é separar a definição e o uso do algoritmo, ou seja, separar o comportamento do algoritmo do ambiente e colocar a definição do algoritmo em uma classe de estratégia especial. Cada classe de estratégia encapsula uma implementação A classe de ambiente é programada para a classe de estratégia abstrata e obedece ao "princípio de inversão de dependência". Quando um novo algoritmo aparece, é necessário apenas adicionar uma nova classe de estratégia concreta que implemente a classe de estratégia abstrata.

O modo de estratégia é o encapsulamento do algoritmo, que separa a responsabilidade do algoritmo do próprio algoritmo e delega o gerenciamento de diferentes objetos. O padrão de estratégia geralmente encapsula uma série de algoritmos em uma série de classes de estratégia concretas como subclasses de classes de estratégia abstratas.

No modo de estratégia, o entendimento das classes de ambiente e classes abstratas de estratégia é muito importante.As classes de ambiente são classes que precisam usar algoritmos. Pode haver várias classes de ambiente em um sistema, e eles podem precisar reutilizar alguns dos mesmos algoritmos.

O modo de estratégia é usado para comutação livre e expansão de algoritmos, e é um dos modos de design mais amplamente usados.
O modo de estratégia corresponde a uma família de algoritmos para resolver um determinado problema, permitindo ao usuário escolher um algoritmo da família de algoritmos para resolver um determinado problema, e ao mesmo tempo pode facilmente substituir o algoritmo ou adicionar um novo algoritmo. Desde que envolva encapsulamento de algoritmo, multiplexação e comutação, o modo de estratégia pode ser considerado.

2. Análise de Papel do Padrão de Estratégia

Diagrama de estrutura do modo de estratégia:
Modo de estratégia

  • Contexto (classe de ambiente): A classe de ambiente é o papel do algoritmo, ele pode usar uma variedade de estratégias ao resolver um determinado problema (ou seja, implementar um determinado método). Mantenha uma instância de referência para a classe de estratégia abstrata na classe de ambiente para definir a estratégia adotada.
  • Estratégia (classe de estratégia abstrata): declara métodos abstratos para os algoritmos suportados e é a classe pai de todas as classes de estratégia.Pode ser uma classe abstrata ou uma classe concreta ou uma interface. A classe de ambiente chama os algoritmos implementados na classe de estratégia concreta em tempo de execução por meio dos métodos declarados na classe de estratégia abstrata.
  • ConcreteStrategy (classe de estratégia específica): Implementa o algoritmo declarado na classe de estratégia abstrata. Em tempo de execução, a classe de estratégia concreta sobrescreve o objeto da classe de estratégia abstrata definido na classe de ambiente e um algoritmo específico é usado para implementar um determinado processo de negócios .

3. Vantagens e desvantagens do modelo de estratégia

vantagem:

  • O modo de estratégia fornece suporte perfeito para o "princípio de abertura e fechamento". Os usuários podem selecionar algoritmos ou comportamentos sem modificar o sistema original ou adicionar novos algoritmos ou comportamentos de maneira flexível.
  • O modo de estratégia fornece uma maneira de gerenciar famílias de algoritmos relacionadas. A estrutura hierárquica da classe de estratégia define um algoritmo ou família de comportamento, e o uso adequado da herança pode mover o código comum para a classe de estratégia abstrata, evitando assim a duplicação de código.
  • O modo de estratégia fornece uma maneira de substituir o relacionamento de herança. Se o modo de estratégia não for usado, a classe de ambiente que usa o algoritmo pode ter algumas subclasses, e cada subclasse fornece um algoritmo diferente. Porém, desta forma, o uso do algoritmo se confunde com o próprio algoritmo, que não obedece ao "princípio de responsabilidade única". A lógica de decidir qual algoritmo utilizar se confunde com o próprio algoritmo, impossibilitando sua evolução. de forma independente e usando a herança não pode realizar a comutação dinâmica de algoritmos ou comportamentos enquanto o programa está em execução.
  • Usar o modo de estratégia pode evitar várias instruções de seleção condicional. Declarações de seleção condicional múltipla não são fáceis de manter. Ele mistura a lógica de qual algoritmo ou comportamento é adotado com a lógica de implementação do algoritmo ou comportamento em si e codifica todos eles em uma enorme declaração de seleção condicional múltipla. O método de diretamente herdar classes de ambiente é primitivo e retrógrado.
  • O modo de estratégia fornece um mecanismo de reutilização de algoritmos. Como os algoritmos são extraídos separadamente e encapsulados em classes de estratégia, diferentes classes de ambiente podem facilmente reutilizar essas classes de estratégia.

Desvantagens:

  • O cliente deve conhecer todas as classes de estratégia e decidir qual classe de estratégia usar. Isso significa que o cliente deve entender a diferença entre esses algoritmos para selecionar o algoritmo apropriado a tempo. Em outras palavras, o modo de estratégia só é aplicável quando o cliente conhece todos os algoritmos ou comportamentos.
  • O modo de estratégia fará com que o sistema produza muitas classes de estratégia específicas e quaisquer pequenas alterações farão com que o sistema adicione uma nova classe de estratégia específica.
  • Não é possível usar várias classes de estratégia no cliente ao mesmo tempo, ou seja, ao usar o modo de estratégia, o cliente só pode usar uma classe de estratégia por vez. Não é possível usar uma classe de estratégia para completar algumas funções e usar outra classe de estratégia para completar as funções restantes.

Cena aplicável:

  • Um sistema precisa selecionar dinamicamente um dos vários algoritmos, então esses algoritmos podem ser encapsulados em classes de algoritmo específicas e essas classes de algoritmo específicas são todas subclasses de uma classe de algoritmo abstrato. Em outras palavras, todas essas classes de algoritmo específicas têm uma interface unificada. De acordo com o "Princípio de Substituição de Richsteel" e o polimorfismo orientado a objetos, o cliente pode escolher usar qualquer classe de algoritmo específica e só precisa manter um tipo de dados como um algoritmo abstrato classe Object.
  • Um objeto tem muitos comportamentos. Se você não usar um modelo apropriado, esses comportamentos só podem ser alcançados usando várias instruções de seleção condicional. Nesse ponto, usar o modo de estratégia para transferir esses comportamentos para as classes de estratégia específicas correspondentes pode evitar o uso de várias instruções de seleção condicional que são difíceis de manter.
  • O cliente não quer saber a estrutura de dados complexa relacionada ao algoritmo. Encapsular o algoritmo e a estrutura de dados relacionada na classe de estratégia específica pode melhorar a confidencialidade e a segurança do algoritmo.

4. Impressão prática

O objetivo é claro e fácil de entender.
As estratégias não se conhecem e não se comunicam.

5. Exemplo de código

// 抽象策略类
abstract class AbstractStrategy {
    
    
    public abstract void algorithm(); //声明抽象算法
}

// 具体策略类
class ConcreteStrategyA extends AbstractStrategy {
    
    
    //算法的具体实现
    public void algorithm() {
    
    
       //...
    }
}

// 环境类,使用算法的角色类
class Context {
    
    
    private AbstractStrategy strategy; //维持一个对抽象策略类的引用
 
    public void setStrategy(AbstractStrategy strategy) {
    
    
        this.strategy= strategy;
    }
 
    //调用策略类中的算法
    public void algorithm() {
    
    
        strategy.algorithm();
    }
}

// 测试
public static void main(String[] args) {
    
    
    Context context = new Context();
    AbstractStrategy strategy = new ConcreteStrategyA(); //可在运行时指定类型
    context.setStrategy(strategy);
    context.algorithm();
}

Acho que você gosta

Origin blog.csdn.net/u014099894/article/details/85195212
Recomendado
Clasificación