Para usar corretamente os padrões de estado e políticas nos aplicativos Java, os desenvolvedores precisam saber claramente a diferença entre os dois padrões. Embora a estrutura dos modos de estado e os modos políticos seja muito semelhante, eles também seguem o princípio de abrir e fechar, representando o 'o' do princípio de design sólido, suas intenções são completamente diferentes. O padrão de política em Java é encapsular um conjunto de algoritmos relacionados, fornecendo à flexibilidade de tempo de execução. O chamador pode escolher diferentes algoritmos em tempo de execução sem modificar a classe de contexto usando a política. Exemplos clássicos do uso de padrões políticos incluem a implementação de algoritmos de criptografia, algoritmos de compressão e algoritmos de classificação. Por outro lado, o modo de estado usa um objeto para mostrar comportamentos diferentes em diferentes estados. Objetos no mundo real também têm estados e se comportarão de maneira diferente de acordo com seus estados. Por exemplo, uma máquina de venda automática só pode vender itens no estado de Hascoin. Se você não enfiar moedas, ele não venderá mercadorias. Agora você pode ver claramente a diferença entre o modo de política e o modo de estado, o objetivo deles é diferente. O modo de estado ajuda um objeto a gerenciar seu estado, enquanto o modo de política permite que os clientes escolham diferentes comportamentos. Outra diferença que não é fácil de ver é quem impulsiona as mudanças de comportamento. No modo de política, é orientado ao cliente, que fornece políticas diferentes para informações de contexto. No modo de estado, a migração de estado é gerenciada pelo próprio contexto ou objeto de estado. Da mesma forma, se você modificar o estado no objeto de estado, ele deverá reter uma referência ao contexto, o que significa que, para a máquina de venda automática, ele poderá chamar o método setState para modificar o estado de contexto atual. Por outro lado, o objeto de política não possui uma referência ao contexto e seu cliente passa a política selecionada para o contexto. Estratégia e padrões estaduais são as perguntas mais fáceis da entrevista sobre os padrões de design de Java. Neste artigo sobre os padrões de design Java, apresentaremos isso em detalhes. Exploraremos as semelhanças e diferenças entre os dois modos, o que ajudará a melhorar sua compreensão dos dois modos.
Semelhanças entre o modo de estado e o modo de política:
Se você olhar para os gráficos UML dos padrões de políticas e padrões de estado, eles parecerão muito semelhantes. No modo de estado, o objeto que usa o objeto de estado para alterar o comportamento é chamado de objeto de contexto. Da mesma forma, no modo de estratégia, o objeto que usa o objeto de estratégia para alterar o comportamento também é um objeto de contexto. Lembre -se, o cliente interage com o objeto de contexto. No modo de estado, o contexto proxy o método chamado do objeto de estado. O objeto atual no contexto é o objeto de estado específico. No modo de política, o contexto também opera o objeto de política. Este objeto é passado como um parâmetro ou é fornecido ao criar o objeto de contexto.
Vamos dar uma olhada em algumas semelhanças entre esses dois principais padrões de design Java:
Tanto o modo de estado quanto o modo de política são fáceis de adicionar novos estados ou políticas sem afetar o uso deles, seguem o princípio do design de abertura e fechamento, o que significa que seu design está aberto a extensões e fechado a modificações. Nesses dois modos, o contexto é fechado para modificação e adiciona um novo estado ou uma política. Você não precisa modificar o objeto de contexto em outros estados ou exigir apenas pequenas alterações. Assim como o objeto de contexto no modo de estado terá um estado inicial, o contexto no modo de política geralmente também possui uma política padrão.
O modo de estado encapsula diferentes comportamentos no caminho de diferentes objetos de estado, enquanto o modo de política encapsula diferentes comportamentos no caminho de diferentes objetos de política.
Ambos os padrões dependem de subclasses específicas para alcançar um comportamento específico. Cada política específica se estende de uma classe de política abstrata, e cada estado também é uma interface usada para representar estados ou uma subclasse da classe abstrata.
Instância do modo de estado
classe pública windowstate {private string stateValue; public windowState (String stateValue) {this.stateValue = stateValue; } public string getStateValue () {return stateValue; } public void setStateValue (String stateValue) {this.stateValue = stateValue; } public void handle () { /** Faça operações diferentes de acordo com diferentes estados e depois alterne o estado* / if ("janela" .equals (stateValue)) {switchwindow (); this.statevalue = "tela cheia"; } else if ("fullcreen" .equals (stateValue)) {switchfullScreen (); this.stateValue = "Window"; }} private void switchWindow () {System.out.println ("Switch to Window State"); } private void switchfullScreen () {System.out.println ("Mudar para o estado de tela cheia"); }} / *** Uso do estado*/ classe pública windowcontext {private windowstate state; public WindowContext (estado do WindowState) {this.state = state; } public windowState getState () {retornar estado; } public void SetState (estado do WindowState) {this.state = state; } public void switchState () {this.state.handle (); }} /* * State (State) mode behavioral mode* Changes both the state of the object and the behavior of the object* According to the state, change the behavior*/ public class Test { public static void main(String[] args) { /* * There are only two state values in this example, which are controlled by the state class itself* You can also control the state value and hand over the client to set */ WindowContext context = new WindowContext(new WindowState("Window")); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); context.switchstate (); }}Imprimir
Mude para o estado da janela para o estado de tela inteira para o estado da janela para o estado de tela inteira
Exemplo de modo de política
/ *** Promoção do produto* Esta categoria é: Coleção em dinheiro*/ interface pública ICASHSUPER {Double AcceptCash (Double Money); } / ** * Coleção normal em dinheiro * @Author Stone * */ public classe CashNormal implementa ICASHSUPER {@Override public Double AcepCash (Double Money) {Return Money; }} / ** * O dinheiro é coletado em descontos * @author stone * */ public classe CashRebate implementa ICASHSUPER {desconto duplo privado; // desconto public CashREBATE (desconto duplo) {this.rebate = RECATE; } @Override public Double AcepCash (Double Money) {Retorne novo BigDecimal (Money * Rebate / 10) .SetScale (2, BigDecimal.Round_Half_Up) .DoubleValue (); }} / ** * REBATO DE CASE com dinheiro * @Author Stone * */ Public Class CashRurn implementa ICASHSuper {Private Double MoneyCondition; // Valor mínimo de reembolso Private Double ReturnMoney; // Valor de retorno CashRETURN Public (Double MoneyCondition, Double ReturnMoney) {this.MoneyCondition = Moneycondition; this.returnMoney = returnMoney; } @Override public Double AcepCash (Double Money) {// REBIÇÃO VULIMENTO IF (Money> = Moneycondition) {Return Money - Math.floor (Money/Moneycondition) * ReturnMoney; } else {retornar dinheiro; }}} / *** Execute o comportamento correspondente com base na classe de política aprovada*/ classe pública CashContext {private IcaShSuper Casher; public CashContext () {} public CashContext (ICASHSuper Casher) {this.casher = Casher; } public void setCasher (ICASHSUPER Casher) {this.caSher = Casher; } // De acordo com o objeto de política específico, o comportamento do algoritmo de chamá -lo de public duplo aceita (dinheiro duplo) {return this.casher.acceptCash (dinheiro); }} classe pública teste {public static void main (string [] args) {duplo dinheiro = 998; // Preço original CashContext CashContext = novo CashContext (novo CashNormal ()); System.out.println ("Preço original:" + CashContext.acceptCash (dinheiro)); // Estratégia Geral CashContext.SetCasher (New CashREBATE (8.5)); System.out.println ("85% de desconto:" + CashContext.acceptCash (dinheiro)); // Estratégia de desconto 85% de desconto em CashContext.setCasher (New CashRETURN (300, 50)); System.out.println ("Retorne 50 se mais de 300:" + CashContext.acceptCash (dinheiro)); // estratégia de reembolso 50 se mais de 300}}Imprimir
Preço original: 998,0 85% de desconto: 848,3 RECATO PARA 50: 848.0 acima de 300
A diferença entre o modo de política e o modo de estado
Aprendemos que os dois padrões são muito semelhantes em estrutura, mas eles ainda têm partes diferentes. Vamos dar uma olhada em algumas das principais diferenças entre eles.
Isso é todas as diferenças entre padrões políticos e padrões de estado em Java. Como eu disse, eles parecem muito parecidos nos diagramas UML, seguem o princípio de abrir e fechar e encapsular o comportamento. O modo de política é usado para encapsular algoritmos ou políticas. Ele será fornecido ao objeto de contexto como um parâmetro ou objeto de combinação em tempo de execução, enquanto o modo de estado é usado para gerenciar a migração do estado.