기술나눔

디자인 패턴 - 관찰자 패턴

2024-07-08

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

1. 옵저버 패턴의 핵심 아이디어

관찰자 패턴은 게시/구독 패턴이라고도 합니다. GOF는 관찰자 패턴을 다음과 같이 정의합니다. 객체 간의 일대다 종속 관계를 정의하여 여러 관찰자 객체가 동시에 동일한 객체에 집중할 수 있도록 합니다. 객체의 상태가 변경되면 해당 객체에 의존하는 모든 객체가 자동으로 알림 및 업데이트됩니다.
아래 그림과 같이 관찰자 패턴에는 5가지 유형의 객체가 포함되어 있습니다.
여기에 이미지 설명을 삽입하세요.

  • 대상 인터페이스주제: 대상 인터페이스는 관찰자 추가 연결(), 관찰자 ​​삭제 detach(), 관찰자에게 알림 informObservers()의 세 가지 인터페이스를 정의하고 자체 작업 함수인 Operation()을 정의합니다.
  • 추상 대상 클래스AbstractSubject: 이 클래스는 추가된 관찰자 개체 목록을 저장하는 데 사용되는 관찰자의 컬렉션 개체 벡터를 정의하고 업데이트할 세 가지 함수( 관찰자 추가 연결(), 관찰자 ​​삭제 detach() 및 관찰자에게 알림 통지)를 구현합니다. 모든 관찰자 개체에 자신을 업데이트하도록 알립니다.
  • 특정 대상 클래스 MySubiect: 추상 대상 클래스 AbstractSubiect를 상속하고, 특정 작업 함수를 작성하여 Operation()을 구현합니다. 이 함수에서는 informObservers()를 호출하여 모든 관찰자에게 스스로 업데이트하도록 알릴 수 있습니다.
  • 관찰자 인터페이스 관찰자: 대상 클래스가 변경될 때 알림을 받아야 하는 객체에 대한 통합 인터페이스 update()를 정의합니다. informObservers()가 호출되면 update() 함수가 호출되어 자체적으로 업데이트됩니다.
  • 구체적인 관찰자 : Observer1, Observer2 등 여러 관찰자 개체를 정의하여 통합 업데이트 기능을 작성할 수 있습니다. 클라이언트 테스트는 관찰자 Observer를 Subject 클래스에 추가하여 모니터링을 구현할 수 있습니다.

구체적인 구현을 살펴보겠습니다.

(1) 관찰자 인터페이스 Observer.java는 통합 업데이트 인터페이스 update()를 정의합니다. 해당 소스 코드는 다음 프로그램에 표시됩니다.

package behavior.observer;


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

	public void update();
}

(2) 옵저버 구현 클래스 Observer1.java는 옵저버의 특정 구현이며, 해당 업데이트 함수를 사용하여 콘솔에 문자열을 출력합니다. 해당 소스 코드는 다음 프로그램에 표시됩니다.

package behavior.observer;


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

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

(3) 옵저버 구현 클래스 Observer2.java는 또 다른 옵저버의 특정 구현이며, 해당 업데이트 함수를 사용하여 콘솔에 문자열을 출력합니다. 해당 소스 코드는 다음 프로그램에 표시됩니다.

package behavior.observer;


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

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

(4) 관찰 인터페이스 Subject.java는 관찰자를 조작하기 위한 세 가지 인터페이스 기능을 정의하고, 자신의 기능을 나타내는 특정 조작 기능 인터페이스를 정의합니다. 해당 소스 코드는 다음 프로그램에 표시됩니다.

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) 관찰된 추상 클래스 AbstractSubject.java는 모든 관찰자 객체를 저장하기 위한 Vector 목록 벡터를 제공하고, 목록 객체를 조작하기 위한 구현 함수를 작성합니다. 해당 소스 코드는 다음 프로그램에 표시됩니다.

package behavior.observer;

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


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

	private Vector