EEALL@ONCE

🔦옵저버 패턴이 뭐야? - 객체 간에 일대다 종속성 : 그게 뭔데? 본문

분류없음지식🔦

🔦옵저버 패턴이 뭐야? - 객체 간에 일대다 종속성 : 그게 뭔데?

올엣원스 2023. 12. 8. 20:21
728x90

옵저버 패턴은 객체 간에 일대다 종속성을 정의하는 디자인 패턴 중 하나입니다. 이 패턴은 한 객체의 상태가 변경될 때, 그 객체에 종속된 다수의 객체들이 자동으로 알림을 받아 상태 변화에 대응할 수 있도록 하는 것이 목적입니다.

여기서 주요 역할은 다음과 같습니다:

  1. Subject(주체): 상태가 변경되는 주체 객체입니다. 여러 옵저버들을 등록하고, 상태 변경 시에 이들에게 알리는 책임이 있습니다.
  2. 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