Compartilhamento de tecnologia

Padrão de Design - Padrão Observador

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. A ideia central do padrão observador

O padrão Observer também é conhecido como padrão Publicar/Assinar. GOF define o padrão do observador da seguinte forma: Define um relacionamento de dependência um-para-muitos entre objetos, permitindo que vários objetos observadores se concentrem no mesmo objeto ao mesmo tempo. Quando o estado do objeto muda, todos os objetos que dependem dele são obtidos. Notificado e atualizado automaticamente.
Conforme mostrado na figura abaixo, o padrão observador contém 5 tipos de objetos.
Insira a descrição da imagem aqui

  • Interface de destinoAssunto: A interface de destino define três interfaces: adicionar observador attachment(), excluir observador detach() e notificar observadores notifyObservers() e definir sua própria função de operação operação().
  • Classe de destino abstrataAbstractSubject: Esta classe define um objeto de coleção vect de observadores, que é usado para armazenar a lista de objetos observadores adicionados e implementa três funções para atualizar: add observer attachment(), delete observer detach() e notificar observadores notifyObservers() Esta lista também; notifica todos os objetos observadores para se atualizarem.
  • Classe alvo específica MySubiect: herda da classe de destino abstrata AbstractSubiect e escreve uma função de operação específica para implementar a operação(). Nesta função, notifyObservers() pode ser chamado para notificar todos os observadores para se atualizarem.
  • Interface do observador Observador: Defina uma interface unificada update() para objetos que precisam ser notificados quando a classe de destino for alterada. Quando notifyObservers() for chamado, a função update() será chamada para se atualizar.
  • observador concreto : Vários objetos observadores podem ser definidos, como Observer1 e Observer2, para escrever funções de atualização unificadas. O Client Test pode implementar o monitoramento adicionando um observador Observer à classe Subject.

Vejamos a implementação específica.

(1) Interface do observador Observer.java define uma interface de atualização unificada update(). Seu código-fonte é mostrado no programa a seguir.

package behavior.observer;


/**
* @author Minggg
* 观察者接口
*/
public interface Observer {

	public void update();
}

(2) A classe de implementação do observador Observer1.java é uma implementação específica de um observador e sua função de atualização é usada para enviar uma string para o console. Seu código-fonte é mostrado no programa a seguir.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer1 implements Observer {

	public void update(){ 
		System.out.println("观察者1得到通知!");
	}
}

(3) A classe de implementação do observador Observer2.java é uma implementação específica de outro observador e sua função de atualização é usada para enviar uma string para o console. Seu código-fonte é mostrado no programa a seguir.

package behavior.observer;


/**
* @author Minggg
* 具体观察者
*/
public class Observer2 implements Observer {

	public void update(){ 
		System.out.println("观察者2得到通知!");
	}
}

(4) A interface observada Subject.java define três funções de interface para observadores operacionais e define uma interface de função operacional específica para representar suas próprias funções. Seu código-fonte é mostrado no programa a seguir.

package behavior.observer;


/**
* @author Minggg
* 被观察者接口
*/
public interface Subject {

	// 增加观察者
	public void attach(Observer observer);
	// 删除观察者
	public void detach(Observer observer);
	// 通知所有观察者
	public void notifyObservers();
	// 自身的操作接口
	public void operation();
}

(5) A classe abstrata observada AbstractSubject.java fornece um vetor de lista de vetores para salvar todos os objetos observadores e escrever funções de implementação para operar os objetos da lista. Seu código-fonte é mostrado no programa a seguir.

package behavior.observer;

import java.util.Enumeration;
import java.util.Vector;


/**
* @author Minggg
* 被观察者抽象类
*/
public abstract class AbstractSubject implements Subject {

	private Vector