EEALL@ONCE
🔦옵저버 패턴이 뭐야? - 객체 간에 일대다 종속성 : 그게 뭔데? 본문
728x90
옵저버 패턴은 객체 간에 일대다 종속성을 정의하는 디자인 패턴 중 하나입니다. 이 패턴은 한 객체의 상태가 변경될 때, 그 객체에 종속된 다수의 객체들이 자동으로 알림을 받아 상태 변화에 대응할 수 있도록 하는 것이 목적입니다.
여기서 주요 역할은 다음과 같습니다:
- Subject(주체): 상태가 변경되는 주체 객체입니다. 여러 옵저버들을 등록하고, 상태 변경 시에 이들에게 알리는 책임이 있습니다.
- Observer(옵저버): 주체의 상태 변경을 감시하고, 상태가 변경될 때 수행할 동작을 정의하는 인터페이스입니다. 주체에서 알림을 받으면 업데이트 메서드를 호출하여 적절한 조치를 취합니다.
public interface Observer { void update(String newState); }
다음으로, 이를 구현하는 구체적인 옵저버 클래스를 만듭니다:
public class ConcreteObserver implements Observer {
private String observerState;
@Override
public void update(String newState) {
observerState = newState;
System.out.println("상태가 변경되었습니다: " + observerState);
}
}
마지막으로, Subject 클래스를 정의하고 옵저버들을 등록하고 알림을 보내는 로직을 구현합니다:
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void setState(String newState) {
state = newState;
notifyObservers();
}
private void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
}
이제 이를 활용해 상태가 변경될 때 옵저버들에게 알림을 보낼 수 있습니다:
public class Main {
public static void main(String[] args) {
Subject subject = new Subject();
ConcreteObserver observer1 = new ConcreteObserver();
ConcreteObserver observer2 = new ConcreteObserver();
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.setState("새로운 상태!");
}
}
이 코드에서 효율적인 부분은 Subject가 옵저버들의 목록을 관리하고, 상태가 변경될 때 일괄적으로 알림을 보내는 부분입니다. 이렇게 하면 Subject와 Observer 간의 결합도를 낮출 수 있어 유지보수성을 향상시킵니다.
효과적인 사용 시 주의할 점은, 옵저버들의 업데이트 메서드가 오래 걸리거나 무한루프에 빠질 경우 성능 이슈가 발생할 수 있다는 것입니다. 이런 경우에는 비동기적인 방법이나 다른 최적화 전략을 고려해야 합니다.
728x90
'분류없음지식🔦' 카테고리의 다른 글
🔦 프록시 객체가 뭔데? - 옵저버 패턴에 사용 (0) | 2023.12.13 |
---|---|
🔦 그래서 싱글턴이 뭔데? Singleton (0) | 2023.12.13 |
🔦팩토리 패턴(Factory Pattern)이 뭔데? (0) | 2023.12.06 |
🔦 의존성 주입이 뭔데 도대체 ? (0) | 2023.12.04 |
🔦 디자인 패턴 :해결책 템플릿 (0) | 2023.12.01 |