JavaRush /Blogue Java /Random-PT /Diferença entre padrões de estado e estratégia em Java
0xFF
Nível 9
Донецк

Diferença entre padrões de estado e estratégia em Java

Publicado no grupo Random-PT
Para usar adequadamente os padrões State e Strategy nas principais aplicações Java, é importante que os programadores Java entendam claramente a diferença entre eles. Embora ambos os padrões, Estado e Estratégia, tenham uma estrutura semelhante, e ambos sejam baseados no princípio aberto/fechado, representando o “O” nos princípios SOLID , eles são completamente diferentes em intenções . Diferença entre padrões de estado e estratégia em Java - 1O padrão Strategy em Java é usado para encapsular conjuntos relacionados de algoritmos para fornecer flexibilidade de execução ao cliente. O cliente pode escolher qualquer algoritmo em tempo de execução sem alterar o contexto da classe que usa o arquivo Strategy. Alguns exemplos populares do padrão Strategy são escrever código que usa algoritmos, como criptografia, compactação ou classificação. Por outro lado, o padrão State permite que um objeto se comporte de maneira diferente em estados diferentes. Porque no mundo real um objeto geralmente tem estados e se comporta de maneira diferente em estados diferentes, por exemplo, uma máquina de venda automática só vende mercadorias se estiver no estado hasCoin, não vende até que você coloque uma moeda nela. Agora você pode ver claramente a diferença entre os padrões de Estratégia e de Estado, são intenções diferentes. O padrão State ajuda um objeto a gerenciar o estado, enquanto o padrão Strategy permite que o cliente escolha um comportamento diferente. Outra diferença que não é tão fácil de perceber é quem está impulsionando a mudança de comportamento. No caso do padrão Strategy, trata-se de um cliente que fornece diversas estratégias ao contexto; no padrão State, a transição é controlada pelo contexto ou pelo estado do próprio objeto. Além disso, se você mesmo gerenciar alterações de estado no objeto State, deverá haver uma referência ao contexto, por exemplo, uma máquina de venda automática deverá ser capaz de chamar um método setState()para alterar o estado atual do contexto. Por outro lado, o objeto Estratégia nunca contém uma referência ao contexto; o próprio cliente passa a Estratégia de sua escolha para o contexto. A diferença entre os padrões State e Strategy é uma das perguntas mais populares das entrevistas sobre padrões Java . Neste artigo sobre padrões Java, examinaremos isso mais de perto. Exploraremos algumas semelhanças e diferenças entre os padrões de Estratégia e Estado em Java que o ajudarão a melhorar sua compreensão desses padrões.

Semelhanças entre os padrões Estado e Estratégia

Se você observar o diagrama UML dos padrões Estado e Estratégia, notará que ambos são semelhantes entre si. Um objeto que usa Estado para mudar seu comportamento é conhecido como Context-objeto, da mesma forma, um objeto que usa Estratégia para mudar seu comportamento é conhecido como Context-objeto. Lembre-se de que o cliente interage com Contexto objeto. No caso do padrão State, o contexto delega métodos de chamada para um objeto State, que é mantido como o objeto atual, e no caso do padrão Strategy, o contexto usa o objeto Strategy como parâmetro ou é fornecido durante a criação. do contexto do objeto. Diagrama UML do padrão State em Java Diferença entre padrões de estado e estratégia em Java - 2 Este diagrama UML para o padrão State descreve o problema clássico de criação de um design de máquina de vendas orientada a objetos em Java. Você pode ver que o estado da máquina de venda automática é representado por meio de uma interface, que então possui uma implementação para representar o estado específico. Cada estado também possui referências ao contexto do objeto para fazer uma transição para outro estado como resultado de ações chamadas no contexto. Diagrama UML do padrão Strategy em Java Diferença entre padrões de estado e estratégia em Java - 3 Este diagrama UML para o padrão Strategy contém vários tipos de implementações funcionais. Como existem muitos algoritmos de classificação, esse padrão de design permite que o cliente escolha um algoritmo ao classificar objetos. Na verdade, a estrutura Java Collection usa esse padrão para implementar um método Collections.sort()usado para classificar objetos em Java. A única diferença é que em vez de permitir que o cliente escolha um algoritmo de classificação, ele permite especificar a estratégia de comparação passando uma instância da interface Comparator ou Comparable para Java . Vejamos algumas semelhanças entre esses dois principais padrões de design em Java:
  1. Ambos os padrões, Estado e Estratégia, facilitam a adição de novos estados e estratégias sem afetar o contexto do objeto que os utiliza.

  2. Ambos mantêm seu código de acordo com o princípio aberto/fechado , o que significa que o design estará aberto a extensões, mas fechado a modificações. No caso dos padrões Estado e Estratégia, o contexto do objeto fica fechado a modificações, introdução de novos Estados ou novas Estratégias, ou não é necessário modificar o contexto do outro estado, ou mudanças mínimas.

  3. Assim como um contexto de objeto começa com o estado de inicialização do objeto no padrão State, um contexto de objeto também possui uma estratégia padrão no caso do padrão Strategy em Java.

  4. O padrão State representa diferentes comportamentos na forma de diferentes estados de objetos, enquanto o padrão Strategy representa diferentes comportamentos na forma de diferentes estratégias de objetos.

  5. Ambos os padrões, Estratégia e Estado, dependem de subclasses de implementação de comportamento. Cada estratégia concreta estende uma Estratégia Abstrata; cada estado é uma subclasse de uma interface ou classe abstrata que é usada para representar o Estado.

Diferenças entre padrões de estratégia e estado em Java

Portanto, agora sabemos que os padrões de Estado e Estratégia são semelhantes em estrutura, mas a sua intenção é diferente. Vejamos algumas diferenças importantes entre esses padrões de design.
  1. O padrão Strategy encapsula um conjunto de algoritmos relacionados e permite que o cliente use comportamentos intercambiáveis ​​apesar da composição e delegação em tempo de execução, por outro lado, o padrão State ajuda uma classe a exibir comportamentos diferentes em estados diferentes.

  2. A próxima diferença entre os padrões State e Strategy é que State encapsula o estado de um objeto, enquanto o padrão Strategy encapsula um algoritmo ou estratégia. Como o estado está associado a um objeto, ele não pode ser reutilizado, mas ao dissociar uma estratégia ou algoritmo de seu contexto podemos reutilizá-lo.

  3. No padrão Estado, um estado pessoal pode conter uma referência ao contexto para implementar transições entre estados, mas uma Estratégia não contém uma referência ao contexto onde é utilizada.

  4. A implementação de uma Estratégia pode ser passada como parâmetro para o objeto que irá utilizá-la, por exemplo Collection.sort() leva um Comparador que é uma estratégia. Por outro lado, o estado faz parte do próprio contexto do objeto e, com o tempo, o contexto do objeto transita de um estado para outro.

  5. Embora tanto a Estratégia como o Estado sigam o princípio aberto/fechado, a Estratégia também segue o Princípio da Responsabilidade Única, uma vez que cada Estratégia contém um algoritmo individual, as diferentes estratégias são independentes umas das outras. Mudar uma estratégia não requer mudar outra estratégia.

  6. Outra diferença teórica entre os padrões Estratégia e Estado é que o criador define a parte “Como” do objeto, por exemplo, “Como” o objeto de classificação classifica os dados, por outro lado, o padrão Estado define “o quê” e “quando” partes do objeto, por exemplo, o que um objeto pode fazer quando está em um determinado estado.

  7. A ordem das transições de estado está bem definida no padrão State; não existe tal requisito para o padrão Strategy. O Cliente é livre para escolher qualquer implementação da Estratégia de sua preferência.

  8. Alguns dos exemplos comuns do padrão Strategy são o encapsulamento de algoritmos, como algoritmos de classificação, algoritmos de criptografia ou algoritmos de compactação. Se você perceber que seu código deve usar diferentes tipos de algoritmos relacionados, considere usar o padrão Strategy. Por outro lado, reconhecer o uso do padrão State é bastante fácil, se você precisar controlar o estado e as transições entre estados sem muitas instruções condicionais aninhadas, o padrão State é o padrão certo a ser usado.

  9. A última, mas uma das diferenças mais importantes entre os padrões State e Strategy, é que uma mudança na Strategy é realizada pelo Cliente, enquanto uma mudança no State pode ser realizada pelo contexto ou pelo próprio estado do objeto.

Isto é tudo sobre a diferença entre os padrões State e Strategy em Java . Como eu disse, ambos são semelhantes em suas classes e diagramas UML, ambos fornecem princípios abertos/fechados e encapsulam comportamento. Use o padrão Strategy para encapsular um algoritmo ou estratégia que é exposto ao contexto em tempo de execução, talvez como um parâmetro ou objeto composto, e use o padrão State para controlar transições de estado em Java. Original aqui
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION