관찰 대상의 상태가 변화하면 관찰자에게 알린다
상태 변화에 따른 처리를 기술할 때 효과적
observer, 능동적인 '관찰자'의 의미와는 달리 Subject 역에서 알려주는 것을 수동적으로 기다린다 (Publish-Subscribe)
view-model (MVC)
Subject 관찰되는 대상, 관찰자인 Observer를 등록/삭제하는 메서드, 현재 상태 가져오는 메서드 선언, NumberGenerator 클래스
ConcreteSubject 구체적인 '관찰되는 대상', 상태가 변경되면 등록된 Observer에 알린다, RandomNumberGenerator
Observer, Subject로부터 상태가 변했다고 전달받는다, 전달받기 위한 메서드는 여기서 update, Observer 인터페이스
ConcreteSubject, 구체적인 Observer, update 메서드 호출 시 그 메서드 안에서 Subject 현재 상태 취득, DigitObserver, GraphObserver
public abstract class NumberGenerator {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void deleteObserver(Observer observer) {
observers.remove(observer);
}
// Observer에 통지
public void notifyObservers() {
for (Observer o: observers) {
o.update(this);
}
}
public abstract int getNumber(); // 수를 취득
public abstract void execute(); // 수를 생성
}
public class DigitObserver implements Observer {
@Override
public void update(NumberGenerator generator) {
System.out.println("DigitObserver: " + generator.getNumber());
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
}
}
}
디자인 패턴의 목적 중 하나는 클래스를 재사용 가능한 부품으로 만드는 것
- 추상클래스나 인터페이스를 사용, 필드나 인수로 인스턴스를 저장할 때 구상 클래스형으로 하지 않고 추상 클래스나 인터페이스형으로 해 둔다
- 구상 클래스형을 신경쓰지 않고 쉽게 교환할 수 있다
1. 구체적인 Observer의 update() 호출 순서가 바뀌어도 문제 없이 동작해야 한다. 즉, 각 클래스의 독립성이 제대로 유지되어야 한다.
2. Observer의 행위가 Subject에 영향을 미칠 때는 무한 호출을 조심해야 한다.
3. 복잡한 프로그램에서는 Observer에 필요한 정보가 무엇인지 Subject에게 의식하게 하는 것은 부담되는 일이다.
void update(NumberGenerator generator)
-> void update(NumberGenerator generator, int number) 갱신 정보 전달
-> void update(int number)
게다가, 하나의 Observer가 여러 Subject를 관찰하는 상황에서는 넘어온 숫자가 어느 Subject에 관한 것인지 모르기 때문에 부적절하다.
Mediator(Mediator, Colleague) 패턴도 상태 변화가 통지된다. 하지만 Colleague 역의 조정을 목적으로 움직이는 Mediator 패턴의 일부에 지나지 않는다. Observer 패턴은 Subject 역의 상태 변화를 Observer 역에 통지하는 것, 통지하고 동기화하는 것에 주안점을 둔다.
'문제 및 이론 정리 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Adapter - 사이에 끼워 재사용한다 (0) | 2025.05.22 |
---|---|
[디자인패턴] Builder - 복잡한 인스턴스를 조립한다 (0) | 2025.04.11 |
[디자인패턴] Facade - 단순한 창구를 만든다 (0) | 2025.03.05 |
[디자인패턴] Factory Method - 하위 클래스에서 인스턴스를 만든다 (0) | 2025.03.02 |
[디자인패턴] State - 상태를 클래스로 표현한다 (0) | 2025.02.25 |