Definição de Estado: Estados diferentes, comportamentos diferentes;
Quando usar o modo de status
O modo de estado é mais comumente usado no uso real e é adequado para "comutação de estado". Como frequentemente usamos se o Else for else para mudar de estados, se esse julgamento de estado for repetido, precisamos pensar se podemos adotar o modo de estado.
Não apenas com base no status, mas também nos atributos. Se as propriedades de um objeto forem diferentes, o comportamento do objeto é diferente. As propriedades, essas mudanças (comutação) das propriedades podem ocorrer a qualquer momento, por isso é possível usar o estado.
No uso real, existem muitas mudanças de estado semelhantes aos interruptores, mas às vezes não é tão óbvio, dependendo da sua experiência e profundidade de entendimento do sistema.
O que queremos explicar aqui é que existem algumas diferenças entre "Estado de comutação de comutação" e "julgamento geral do estado".
A cópia do código é a seguinte:
if (que == 1) estado = "olá";
caso contrário, se (que == 2) estado = "oi";
caso contrário, se (que == 3) estado = "tchau";
Este é um "julgamento geral do estado". Se alterado para:
A cópia do código é a seguinte:
if (state.euqals ("tchau")) state = "hello";
caso contrário, if (state.euqals ("hello)) state =" hi ";
caso contrário, if (state.euqals ("oi")) state = "tchau";
Este é o "Estado de comutação de comutação", que é alternar o estado do estado de "Hello" para "Hi" e depois para "tchau"; O estado pode ser alterado no modo de estado é usado.
Se você simplesmente mudar a direção "Hello"-> "Hi"-> "Tchau"-> "Hello" no acima, você não precisa necessariamente usar o modo de estado, porque o modo de estado criará muitos Subclasses.
Por favor, veja o seguinte exemplo:
A cópia do código é a seguinte:
Public Class Context {
estado de cor privado = nulo;
public void push () {
// se o estado vermelho atual for alterado para azul
if (state == color.red) estado = color.blue;
// se o estado azul atual for alterado para verde
caso contrário, if (state == color.blue) state = color.green;
// se o estado preto atual for trocado para vermelho
caso contrário, if (state == color.black) state = color.red;
// se o estado verde atual for alterado para preto
caso contrário, if (state == color.green) state = color.black;
Amostra de amostra = nova amostra (estado);
sample.operate ();
}
public void pull () {
// É exatamente o oposto da comutação do estado push se (estado == color.green) estado = color.blue;
caso contrário, if (state == color.black) state = color.green;
caso contrário, if (state == color.blue) state = color.red;
caso contrário, if (estado == color.red) state = color.black;
Amostra2 amostra2 = novo amostra2 (estado);
sample2.operado ();
}
}
No exemplo acima, temos duas ações, empurre e pule.
Observe também: No exemplo, a mudança de estado é apenas uma atribuição de cores simples. Use o padrão.
Por exemplo: as contas bancárias geralmente alternam entre o estado aberto e o estado próximo.
Por exemplo: o clássico TCPConnection, o Estado do TCP tem três estados: criar fechos de audição e conversões repetidas.
Por exemplo: a conta do POP da caixa de correio terá quatro estados, iniciar o nome autorizado, o comportamento correspondente de cada estado deve ser relativamente grande, adequado para o uso do estado.
Por exemplo: a seleção de diferentes ferramentas na caixa de ferramentas pode ser considerada como alternância entre diferentes ferramentas, adequada para o uso do estado. Por exemplo, se você tiver um programa de desenho específico, os usuários podem escolher diferentes ferramentas para desenhar a curva reta da caixa.
Como usar o modo de estado
O estado exige que dois tipos de entidades participem:
1. Manager o gerente do estado é um interruptor.
2. A classe pai implementada por classes ou interfaces abstratas, diferentes estados estão herdando diferentes subclasses dessa classe pai.
Tomando o contexto acima como exemplo, queremos modificá -lo e criar dois tipos de entidades.
O primeiro passo é criar uma classe pai:
A cópia do código é a seguinte:
Estado de classe abstrata pública {
abstrato público handlepush (contexto C);
Public Abstract Void Handlepull (Contexto C);
Public Abstract Void GetColor ();
}
Os métodos na classe pai devem corresponder ao comportamento do Switch no gerente do estado. deve ser manuseado especificamente.
A seguir, são apresentadas as implementações de subclasses específicas:
A cópia do código é a seguinte:
classe pública Bluestate estende o estado {
public void handlepush (contexto c) {
// De acordo com o método push "se for azul, mude para verde";
C.SetState (New GreenState ());
}
public void handlepull (contexto c) {
// De acordo com o método de tração "se for azul, mude para vermelho";
C.SetState (New RedState ());
}
public abstract void getColor () {return (color.blue)}
}
Da mesma forma, as subclasses em outros estados são implementadas como azul.
O segundo passo é reescrever o gerente do estado, que é o contexto deste exemplo:
A cópia do código é a seguinte:
contexto da classe ublic {
Estado do Sate Privado = NULL;
// SetState é usado para alterar o estado de estado usando o SetState para alcançar a troca de estado
Pulic Void SetState (estado de estado) {
this.state = state;
}
public void push () {
// Os detalhes da troca de estado são, neste caso, a mudança de cor, que foi encapsulada no guidão da subclasse, e não há necessidade de se preocupar com o estado.
// porque a amostra precisa usar um resultado de comutação em estado, use getColor ()
Amostra de amostra = nova amostra (state.getColor ());
sample.operate ();
}
public void pull () {
state.Handlepull (isto);
Amostra2 amostra2 = new sample2 (state.getColor ());
sample2.operado ();
}
}
Nesse ponto, implementamos o processo de refatoração de estado.
O acima é apenas um exemplo bastante simples.