Este artigo descreve o uso do modo de observador para implementar a função de alerta de alta temperatura do departamento meteorológico. Compartilhe -o para sua referência, como segue:
1. Definição do padrão
Modo de observador, também conhecido como modo de publicação/inscrição. O padrão do observador define uma dependência um para muitos entre objetos. Quando o estado de um objeto muda, todos os objetos que dependem dele são notificados e atualizados automaticamente.
2. Exemplos do modelo
1 Análise de padrão
Emprestamos o aviso de alta temperatura do Bureau Meteorológico para ilustrar esse modelo.
2 Diagrama de classe estático de padrão de observador
3 exemplos de código
3.1 interface do observador-iobserver
pacote com.demo.observer; importar com.demo.subject.isubject;/** * interface do observador * @author * */interface pública iobserver {// update método public void update (assunto isubject);}3.2 Isubjectos da interface de tópicos
pacote com.demo.subject; importar com.demo.observer.iobserver;/** * interface de tópico (observer) * * @author * */interface pública isubject {/** * add observador * * @paramver * @return */public boolean (iobServer observador); / ** * Exclua observador * * @param observador * @return */ public boolean Remover (iobserver observador); / *** notifique todos os observadores para atualizar dados*/ public void notifyAllObServer (); / ** * Defina o valor da temperatura * * @param Temperatura */ public void Setemperature (temperatura da flutuação); / ** * Obtenha um aviso de temperatura * * @return */ public string temperatureReport ();}3.3 Implementação de um assunto em tópicos específicos
package com.demo.subject;import java.util.Iterator;import java.util.Vector;import com.demo.observer.IObserver;/** * Theme implementation class (observer) * * @author * */public class Subject implements ISubject { // Temperature/** * (I) High temperature yellow warning signal* * Standard: The maximum daily temperature will be above 35℃ for three dias consecutivos. * * (2) sinal de aviso de laranja de alta temperatura * * Padrão: a temperatura máxima aumentará para acima de 37 ℃ dentro de 24 horas. * * (Iii) Sinal de aviso vermelho de alta temperatura * * Padrão: a temperatura máxima aumentará para acima de 40 ℃ dentro de 24 horas. */ temperatura de flutuação privada; // Nível de aviso prévio String Private String WarningLevel; // Salvar lista de observador de observador privado vetor final <oobserver> vetor; / *** Construa o método Inicialize a lista de observador*/ public substet () {vector = new Vector <Iobserver> (); } / *** Adicionar observador* / public boolean add (iobserver observador) {if (observador! } retornar false; } / *** Remova o observador* / public boolean Remover (IOBServer Observer) {return Vector.Remove (Observer); } / *** Notifique todos os observadores para atualizar dados* / public void notifyAllObServer () {System.out.println ("============ O departamento meteorológico libera alta temperatura" + this.oBSERVERVELTELTENTETRATER) WHETERATER (ITERTOR); (iterator.hasnext ()) {(iterator.next ()). update (this); = "amarelo"; */ public void Setemperature (temperatura do float) {this.temperature = Temperatura;3.4 Observador pessoal-PsonoBServer
pacote com.demo.observer; importar com.demo.subject.isubject;/** * Observador de usuário individual * @author * */classe pública Persobserver implementa IoBServer {public void update (súdito iSUbject) {System.out.println ("Os indivíduos recebem alerta de alta temperatura:" + Subject.temper) {System.out.println (" }}3.5 Governo-observador-governo
pacote com.demo.observer; importar com.demo.subject.isubject;/** * Observador do usuário do governo * @author * */public class GovernmentObserver implementa IoBServer {public void update: "Subject) {System.out.println (" Departamento do Governo recebeu uma alerta de alta temperatura: " }}3.6 CompanyObserver
pacote com.demo.observer; importar com.demo.subject.isubject;/** * Enterprise and Institutions User Observer * @author * */classe pública CompanyObserver implementa IObServer {public void upderation (ISUBJECT SUBTEND) {System.out.println ("Enterprises e Instituições e Instituições Highting (ISubject) {System.out.println (" Enterprises e Instituições e High Rettipering) }}3.7 Deixe o sistema começar a executar um cliente
pacote com.demo; importar java.util.random; importar com.demo.observer.companyobserver; importar com.demo.observer.governmentObserver; import.demo.observer.personObserver; impor.demo.subject.isbject; importa.merver.personobserver; @Author * */public class Client {/** * @param args */public static void main (string [] args) {// crie objeto tópico ISUBJECT SUDOND = novo sujeito (); // Adicione o observador da empresa e da instituição sujeito. // Adicione o observador do sujeito do usuário do governo. // Adicione o observador do sujeito individual do usuário.Add (new PersobServer ()); Aleatório aleatório = novo aleatório (); int i = 0; enquanto (++ i <10) {// define a temperatura aleatória sujeito.setTemperature (Random.NextInt (45)); }}}4 resultados de execução
========= O Departamento Meteorológico emite um alarme amarelo de alta temperatura! =======
Empresas e instituições recebem alerta de alta temperatura: temperatura: 35.0
Departamentos do governo receberam alerta de alta temperatura: temperatura: 35.0
Os indivíduos recebem alerta de alta temperatura: temperatura: 35.0
======== O Departamento Meteorológico emite um alarme vermelho para alta temperatura! =======
Empresas e instituições recebem alerta de alta temperatura: temperatura: 43.0
Departamentos do governo receberam alerta de alta temperatura: temperatura: 43.0
Os indivíduos recebem alerta de alta temperatura: temperatura: 43.0
======== O Departamento Meteorológico emite um alarme laranja de alta temperatura! =======
Empresas e instituições recebem alerta de alta temperatura: temperatura: 37.0
Departamentos do governo receberam alerta de alta temperatura: temperatura: 37.0
Os indivíduos recebem alerta de alta temperatura: temperatura: 37.0
3. Os princípios de design deste modelo
1 Princípio "Aberto"
2 Princípio de responsabilidade única
3. O princípio da inversão de dependência
4. Use ocasiões
1 Quando um modelo abstrato tem dois aspectos, um dos quais depende do outro, e precisa ser encapsulado em objetos independentes e mudou de forma independente e se multiplicou.
2 Quando a alteração de um objeto em um sistema exige alterar o conteúdo de outros objetos ao mesmo tempo, mas você não sabe quantos objetos devem ser alterados.
3 Quando a alteração de um objeto deve ser notificada para fazer alterações correspondentes, mas não é possível determinar quem o objeto é notificado.
5. Diagrama de classe "Pull Data"
Os chamados "dados de empurrar" significam que, quando o objeto observado muda, os dados relevantes são passados para o observador através de parâmetros, que formam o observador "empurrando dados" para o observador. O diagrama de classe estática é o seguinte:
6.
Os chamados "dados de puxar", o objeto Observer contém uma referência à instância do objeto que está sendo observado. Quando o objeto observado altera, nenhum dado será passado para o observador. O observador obtém ativamente os dados relevantes com base na referência do objeto que está sendo observado. Isso forma o observador "puxa ativamente os dados" do objeto que está sendo observado. O diagrama de classe estática é o seguinte:
For more Java-related content, readers who are interested in this site can view the topics: "Introduction and Advanced Tutorial on Java Object-Oriented Programming", "Tutorial on Java Data Structure and Algorithm", "Summary of Java Operation DOM Node Skills", "Summary of Java File and Directory Operation Skills" and "Summary of Java Cache Operation Skills"
Espero que este artigo seja útil para a programação Java de todos.