Latest web development tutorials

padrão Observer

Quando há muitos relacionamentos entre os objetos, use o padrão Observer (Observador Padrão). Por exemplo, quando um objeto é modificado, ele irá notificar automaticamente seus objetos dependentes. O observador padrão pertence a padrões comportamentais.

introdução

Intenção: definir as dependências entre objetos de um-para-muitos, quando o estado de um objeto é alterado, todos os objetos que dependem dele são notificados e atualizados automaticamente.

Principalmente para resolver: um estado da notificação de alteração de objeto para os problemas de outros objetos, mas também tendo em conta a facilidade de uso e baixo acoplamento, assegurar um elevado grau de colaboração.

Quando usar: um objeto (objeto de destino) muda de estado, todos os objetos dependentes (objetos de observação) será notificado, a notificação transmitida.

Como corrigir: o uso da tecnologia orientada a objetos, esta dependência pode ser enfraquecida.

O código-chave: classe abstrata tem um ArrayList armazenado observadores.

Exemplos de aplicação: 1, quando o leilão, o leiloeiro observar o preço mais alto, e depois notificar outros licitantes lance.2, Journey to the West dentro Wukong pedido de entrega Red Boy Buddha, água Buddha derramado sobre o piso de uma antiga provocam tartaruga, esta tartaruga é o observador, ele observou que a ação Buddha rega.

Vantagens: 1, o observador eo observado são abstratos acoplado.2, para estabelecer um mecanismo de gatilho.

Desvantagens: 1, se o objeto observado tem um monte de observador direta e indireta, ele irá notificar todos os observadores estão a gastar um monte de tempo.2, se há uma dependência circular entre o observador eo observado alvo, observar o alvo irá disparar chamadas para circular entre eles, pode causar a falha do sistema. 3, o modo de observador não existe nenhum mecanismo para permitir que o espectador conhecer o público é a forma como as mudanças observadas, mas só sei que as mudanças alvo de observação.

cenários de uso: 1, método comum sub-classe múltipla, e a mesma lógica.2, métodos importantes e complexas pode ser considerado como um método padrão.

Nota: 1, JAVA já tem observadores classes de suporte modo.2, para evitar referências circulares. 3, se a ordem de execução, um visualizador pode causar erros de sistema presos, geralmente usam o modo assíncrono.

realização

O observador padrão usando três classes Assunto, observador e cliente. Sujeito ao objeto cliente com o objeto e o observador é métodos observadores ligados amarradas Client Solutions a partir de objetos. Nós criamos aclasse Assunto,Observer classe abstrata e estender a classeObserverabstrato classe de entidade.

ObserverPatternDemo,nossas aulas de demonstração utilizando objetos de classe e entidadessujeitasa demonstrar o padrão Observer.

A UML diagrama de observador padrão

passo 1

Criar categoria de assunto.

Subject.java

importação java.util.ArrayList;
import java.util.List;

classe pública Assunto {
	
   Lista privada <Observer> observadores 
      = New ArrayList <Observer> ();
   Estado int privado;

   getState int pública () {
      estado retornar;
   }

   setState public void (estado int) {
      this.state = Estado;
      notifyAllObservers ();
   }

   public void anexar (Observer observador) {
      observers.add (observador);		
   }

   notifyAllObservers public void () {
      for (Observer observador: observadores) {
         observer.update ();
      }
   } 	
}

passo 2

Criar classe Observer.

Observer.java

Observer classe abstrata pública {
   protegidas assunto Assunto;
   void update abstrato pública ();
}

passo 3

Criar classe de entidade observadora.

BinaryObserver.java

classe pública BinaryObserver estende Observer {

   pública BinaryObserver (Reservamos o sujeito) {
      this.subject = assunto;
      this.subject.attach (this);
   }

   @Override
   public void update () {
      System.out.println ( "string binária:" 
      + Integer.toBinaryString (subject.getState ())); 
   }
}

OctalObserver.java

classe pública OctalObserver estende Observer {

   pública OctalObserver (Reservamos o sujeito) {
      this.subject = assunto;
      this.subject.attach (this);
   }

   @Override
   public void update () {
     System.out.println ( "Octal Cadeia:" 
     + Integer.toOctalString (subject.getState ())); 
   }
}

HexaObserver.java

classe pública HexaObserver estende Observer {

   HexaObserver público (assunto Assunto) {
      this.subject = assunto;
      this.subject.attach (this);
   }

   @Override
   public void update () {
      System.out.println ( "Hex Cadeia:" 
      + Integer.toHexString (subject.getState ()) .toUpperCase ()); 
   }
}

passo 4

Use objetos entidadesujeitae de observadores.

ObserverPatternDemo.java

ObserverPatternDemo classe pública {
   main (String [] args) public static void {
      Assunto subject = assunto novo ();

      nova HexaObserver (sujeito);
      nova OctalObserver (sujeito);
      nova BinaryObserver (sujeito);

      System.out.println ( "Primeira mudança de estado: 15");	
      subject.setState (15);
      System.out.println ( "Second mudança de estado: 10");	
      subject.setState (10);
   }
}

passo 5

Verifique saída.

Primeira mudança de estado: 15
Hex Cadeia: F
Cadeia Octal: 17
String binária: 1111
Segundo mudança de estado: 10
Hex Cordas: Um
Cadeia Octal: 12
String binária: 1010