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:
- 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();
}