Definição: Defina uma dependência um para muitos entre objetos, para que, quando cada objeto altere seu estado, todos os objetos que dependem dele serão notificados e atualizados automaticamente.
Tipo: padrão comportamental
Diagrama de classe:
Geralmente, é necessário nos sistemas de software: se o estado de um objeto mudar, alguns objetos relacionados a ele também mudarão de acordo. Por exemplo, queremos projetar uma função de menu com o botão direito do mouse. Enquanto clicarmos com o botão direito do mouse na área efetiva do software, um menu será exibido; Por exemplo, queremos projetar uma função de implantação automática, assim como quando o Eclipse for desenvolvido, desde que o arquivo seja modificado, o Eclipse implantará automaticamente o arquivo modificado no servidor. Existe uma semelhança entre essas duas funções, ou seja, um objeto deve sempre monitorar outro objeto e, enquanto seu estado mudar, ele tomará ações correspondentes. De fato, existem muitas soluções que podem conseguir isso, mas o uso do modelo Observer é sem dúvida uma escolha convencional.
A estrutura do padrão do observador
No modo de observador mais básico, os quatro caracteres a seguir estão incluídos:
Observador: a partir do diagrama de classe, você pode ver que existe um contêiner de vetor na classe que armazena o objeto Observador (a razão pela qual o vetor é usado em vez de listar é porque quando as operações com vários threads, o vetor é seguro, enquanto a lista não é segura). Este contêiner de vetor é o núcleo da classe Observer. Existem três outros métodos: o método de anexo é adicionar o objeto Observer a este contêiner; O método destacar é remover o objeto Observador do contêiner; O método Notify é chamar os métodos correspondentes do objeto Observer, por sua vez. Esse papel pode ser uma interface, uma classe abstrata ou uma classe concreta, porque em muitos casos será misturada com outros padrões; portanto, há mais casos de uso de classes abstratas.
Observador: A função do observador geralmente é uma interface, que possui apenas um método de atualização. Quando o estado do observador mudar, esse método será chamado.
Observador específico: essa função é usada para fácil expansão, e a lógica de negócios específica pode ser definida nessa função.
Observador específico: a implementação específica da interface do observador. Nesta função, a lógica a ser processada quando o estado do objeto é observado muda.
Exemplo de implementação do modo de observador
Interface de assunto
Public Interface Assunto {public void RegisterObServer (Observer O); public void RemowObServer (Observer O); public void notifyAllobServers ();}Interface do observador
Public Interface Observer {public void update (sujeitos s);}A classe Hunter implementa a interface do assunto
importar java.util.arraylist; classe pública Headhunter implementa o assunto {// define uma lista de usuários, como Mike, Bill, etc. Private ArrayList <Beserver> UserList; Trabalhos privados de ArrayList <String>; public headhunter () {userList = new ArrayList <Tenerver> (); Jobs = novo ArrayList <String> (); } @Override public void RegisterObServer (Observer o) {userList.add (O); } @Override public void RemowObServer (Observer o) {} @Override public void notifyAllobServers () {for (observador o: userlist) {o.Update (this); }} public void addJob (String Job) {this.jobs.add (Job); notifyAllObServers (); } public ArrayList <String> getJobs () {retorna trabalhos; } public string tostring () {return jobs.toString (); }}JobSeeker é um observador:
classe pública JobSeeker implementa o observador {private string name; public JobSeeker (nome da string) {this.name = name; } @Override public void update (sujeito s) {System.out.println (this.name + "foi notificado!"); // Print Job List System.out.println (S); }}Comece:
classe pública principal {public static void main (string [] args) {headhunter hh = new headhunter (); HH.RegisterObServer (New JobSeeker ("Mike")); HH.RegisterObServer (New JobSeeker ("Chris")); HH.RegisterObServer (New JobSeeker ("Jeff")); // Toda vez que você adiciona um emprego, todos os trabalhos podem ser notificados. hh.addjob ("Google Job"); hh.addjob ("Yahoo Job"); }} Vantagens do modo de observador
O observador e o observador estão ligeiramente relacionados e estão abstravelmente acoplados, de modo que é mais fácil expandir para ambos.
O modo Observador é um mecanismo de gatilho comumente usado, que forma uma cadeia de gatilho e processa os métodos de cada observador por sua vez. Mas, ao mesmo tempo, isso também é uma desvantagem do modo de observador. Como é desencadeado em uma cadeia, quando há muitos observadores, o problema de desempenho é mais preocupante. Além disso, na estrutura da cadeia, é mais provável que os erros de referência circulares ocorram, fazendo com que o sistema seja falsificado.
Resumir
No idioma Java, existe um observador de interface e sua classe de implementação observável, que geralmente implementa o papel do observador. Podemos ver os métodos de uso dessas duas classes na documentação da API JDK.
Amigos que fizeram VC ++, JavaScript DOM ou AWT Development são incríveis sobre seu processamento de eventos. Depois de entender o padrão do observador, eles têm um certo entendimento dos princípios do mecanismo de processamento de eventos. Se você deseja projetar uma função de um mecanismo de processamento de acionamento de eventos, o uso do modo Observer é uma boa escolha. O Evento Processando Dem (modelo de delegação de delegação) no AWT é implementado usando o modo Observer.