Padrão de estratégia do padrão de design java (Padrão de estratégia)

conceito

Padrão de estratégia: define uma série de algoritmos, encapsula cada algoritmo e os torna intercambiáveis. O padrão de estratégia permite que o algoritmo varie independentemente dos clientes que o utilizam, também conhecido como padrão de política (Policy).

usar

Combinado com o conceito de modo de estratégia, vamos encontrar uma cena prática para entender.

Suponha que somos uma livraria recém-inaugurada. Para atrair clientes, lançamos serviços de adesão. Dividimos os membros da loja em três tipos, ou seja, membros juniores, membros intermediários e membros seniores. Oferecemos diferentes descontos para diferentes níveis de membros. Não oferecemos descontos em livros para membros juniores, 10% para membros intermediários e 20% para membros seniores.

Esperamos que quando o usuário pagar, ele só precise passar o código de barras do livro, e o membro passe novamente o cartão de sócio, para que o pessoal do caixa saiba diretamente quanto deve ser cobrado do cliente.

No caso de não usar padrões, podemos usar declarações no método de liquidação if/elsepara distinguir diferentes membros para calcular o preço.

Mas e se quisermos mudar o desconto do membro júnior para 12% em um dia? E se eu quiser lançar uma super assinatura um dia? E se um dia eu quiser limitar o número de livros que podem ser descontados para membros intermediários?

Usando if\elseo sistema projetado, todos os algoritmos são escritos juntos, desde que haja uma alteração, tenho que modificar toda a classe. Todos sabemos que, desde que o código seja modificado, é possível introduzir problemas. Para evitar esse problema, podemos usar o padrão de estratégia. . .

Para o sistema de caixa registradora, ao calcular contas a receber, um cliente pode ser apenas um dos membros principais, intermediários e seniores. Afiliados diferentes usam algoritmos diferentes para calcular os preços. O sistema de caixa registradora não se preocupa com a relação entre tipos específicos de associação e descontos. Você também não deseja que nenhuma alteração entre associações e descontos afete o sistema de checkout.

Antes de apresentar a implementação específica do padrão de estratégia, vamos consolidar alguns princípios de design orientado a objetos: 封装变化, 多用组合,少用继承, 针对接口编程,不针对实现编程. Pense em como isso pode ser aplicado ao padrão de estratégia e quais são os benefícios.

Método para realizar

O padrão de estratégia inclui os seguintes papéis:

Contexto: classe de ambiente

Estratégia: classe de estratégia abstrata

ConcreteStrategy: aula de estratégia concreta

[ estratégia][4]

Usamos o padrão de estratégia para realizar o sistema de caixa registradora da livraria. Podemos abstrair membros em uma classe de estratégia, e diferentes tipos de membros são classes de estratégia específicas. O algoritmo para cálculo de preços é implementado em diferentes classes de estratégia. Em seguida, integre os membros na caixa registradora por meio de combinação.

Primeiro defina uma interface, essa interface é uma classe de estratégia abstrata, essa interface define o método de cálculo do preço e o método de implementação específico é definido pela classe de estratégia específica.

/**
 * Created by hollis on 16/9/19. 会员接口
 */
public interface Member {

    /**
     * 计算应付价格
     * @param bookPrice 书籍原价(针对金额,建议使用BigDecimal,double会损失精度)
     * @return 应付金额
     */
    public double calPrice(double bookPrice);
}

Para membros diferentes, defina três classes de estratégia específicas e cada classe implemente o método de cálculo de preços, respectivamente.

/**
 * Created by hollis on 16/9/19. 初级会员
 */
public class PrimaryMember implements Member {

    @Override
    public double calPrice(double bookPrice) {
        System.out.println("对于初级会员的没有折扣");
        return bookPrice;
    }
}

/**
 * Created by hollis on 16/9/19. 中级会员,买书打九折
 */
public class IntermediateMember implements Member {

    @Override
    public double calPrice(double bookPrice) {
        System.out.println("对于中级会员的折扣为10%");
        return bookPrice * 0.9;
    }
}

/**
 * Created by hollis on 16/9/19. 高级会员,买书打八折
 */
public class AdvancedMember implements Member {

    @Override
    public double calPrice(double bookPrice) {
        System.out.println("对于高级会员的折扣为20%");
        return bookPrice * 0.8;
    }
}

As definições das categorias acima incorporam 封装变化os princípios de design e as mudanças nos métodos de desconto específicos de diferentes membros não afetarão outros membros.

Depois de definir a classe de estratégia abstrata e a classe de estratégia específica, vamos definir a classe de ambiente.A chamada classe de ambiente é a classe do algoritmo integrado. Neste exemplo, o sistema de caixa registradora. Os membros são integrados de forma combinada.

/**
 * Created by hollis on 16/9/19. 书籍价格类
 */
public class Cashier {

    /**
     * 会员,策略对象
     */
    private Member member;

    public Cashier(Member member){
        this.member = member;
    }

    /**
     * 计算应付价格
     * @param booksPrice
     * @return
     */
    public double quote(double booksPrice) {
        return this.member.calPrice(booksPrice);
    }
}

Essa classe Cashier é uma classe de ambiente e a definição dessa classe incorpora 多用组合,少用继承dois 针对接口编程,不针对实现编程princípios de design. Como o método de combinação + interface é adotado aqui, não precisamos modificar a classe Cashier ao lançar super membros posteriormente. Basta definir SuperMember implements Membermais um.

Vamos definir um cliente para testá-lo:

/**
 * Created by hollis on 16/9/19.
 */
public class BookStore {

    public static void main(String[] args) {

        //选择并创建需要使用的策略对象
        Member strategy = new AdvancedMember();
        //创建环境
        Cashier cashier = new Cashier(strategy);
        //计算价格
        double quote = cashier.quote(300);
        System.out.println("高级会员图书的最终价格为:" + quote);

        strategy = new IntermediateMember();
        cashier = new Cashier(strategy);
        quote = cashier.quote(300);
        System.out.println("中级会员图书的最终价格为:" + quote);
    }
}

//对于高级会员的折扣为20%
//高级会员图书的最终价格为:240.0
//对于中级会员的折扣为10%
//中级会员图书的最终价格为:270.0

Como pode ser visto no exemplo acima, o padrão de estratégia apenas encapsula o algoritmo e fornece novos algoritmos para serem inseridos no sistema existente.O padrão de estratégia não decide quando usar qual algoritmo. Cabe ao cliente decidir qual algoritmo usar em quais circunstâncias.

  • O foco do padrão de estratégia

    • O foco do padrão de estratégia não é como implementar algoritmos, mas como organizar e chamar esses algoritmos, para que a estrutura do programa seja mais flexível, com melhor manutenibilidade e escalabilidade.
  • Igualdade algorítmica

    • Uma grande característica do padrão de estratégia é a igualdade de cada algoritmo de estratégia. Para uma série de algoritmos de estratégia específicos, o status de todos é exatamente o mesmo. É por causa dessa igualdade que os algoritmos podem ser substituídos uns pelos outros. Todos os algoritmos de política também são independentes entre si em termos de implementação e não há dependência um do outro.

    • Portanto, esta série de algoritmos de política pode ser descrita assim: Algoritmos de política são diferentes implementações do mesmo comportamento.

  • Exclusividade da política de tempo de execução

    • Durante a operação, o padrão de estratégia pode usar apenas um objeto de implementação de estratégia específico em cada momento.Embora possa alternar dinamicamente entre diferentes implementações de estratégia, apenas um pode ser usado ao mesmo tempo.
  • comportamento público

    • É comum ver que todas as classes de estratégias concretas compartilham algum comportamento comum. Neste momento, esses comportamentos públicos devem ser colocados na classe Strategy de função de estratégia abstrata comum. É claro que, neste momento, a função de estratégia abstrata deve ser implementada com uma classe abstrata Java em vez de uma interface. ([Modo de Estratégia de "JAVA e Modo"][5])

Vantagens e desvantagens do padrão de estratégia

vantagem

  • O modo de estratégia fornece suporte perfeito para o "princípio de abertura-fechamento" Os usuários podem escolher algoritmos ou comportamentos sem modificar o sistema original e também podem adicionar novos algoritmos ou comportamentos com flexibilidade.
  • O padrão Strategy fornece uma maneira de gerenciar famílias de algoritmos relacionados. Uma hierarquia de classes de estratégia define um algoritmo ou família de comportamentos. O uso adequado da herança pode mover o código comum para a classe pai, evitando assim a duplicação de código.
  • Use o padrão de estratégia para evitar o uso de várias instruções condicionais (if-else). Múltiplas declarações condicionais não são fáceis de manter. Ele mistura a lógica de qual algoritmo ou comportamento adotar com a lógica do algoritmo ou comportamento e lista todos eles em uma declaração condicional múltipla, que é mais primitiva e retrógrada do que o método de herança .

deficiência

  • Os clientes devem estar cientes de todas as classes de políticas e decidir por si mesmos qual delas usar. Isso significa que o cliente deve entender a diferença entre esses algoritmos para selecionar a classe de algoritmo apropriada no momento certo.
  • Como o padrão de estratégia encapsula cada implementação de estratégia específica separadamente em uma classe, se houver muitas estratégias alternativas, o número de objetos será considerável. O número de objetos pode ser reduzido até certo ponto usando o padrão flyweight.

Acho que você gosta

Origin blog.csdn.net/zy_dreamer/article/details/132364399
Recomendado
Clasificación