복습

옵저버 패턴(Observer Pattern) 본문

CS/Design Pattern

옵저버 패턴(Observer Pattern)

ykm1256 2023. 3. 29. 01:44

옵저버 패턴이란?

객체의 상태 변화를 관찰하는 옵저버(관찰자)들의 목록을 객체에 등록하여
상태 변화가 있을 때마다 notify를 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴

  • 유튜브로 예를 들면 해당 채널을 구독하고 있는 구독자들에게는 영상이 업로드 되면 알림이 가지만,
  • 구독하고 있지 않은 사람에게는 알림이 가지않는다.
  • 따라서 구독하지 않은 사람은 영상이 업로드 되었는지 계속 확인해야 한다.(폴링)
  • 폴링이란?
    • 하나의 장치 또는 프로그램이 다른 장치 또는 프로그램의 상태를 주기적으로 검사하여 작업을 처리하는 방식

옵저버 패턴 클래스 다이어그램

  • 관찰 대상인 Subject 인터페이스, 관찰을 하는 Observer 인터페이스
  • 각 인터페이스를 구현한 ConcreteSubject(주제 객체), ConcreteObserver(옵저버) 클래스가 있다.
  • 주제 객체는 옵저버를 등록 및 취소를 하고 상태 변경을 알린다.
  • 옵저버는 알림을 받아 로직을 처리한다.

옵저버 패턴 특징

  • 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 알리고 갱신하는 1:N 관계이다.
  • 주제와 옵저버가 느슨하게 결합되어 있다.

옵저버 패턴 구현

Youtuber 인터페이스(주제)

public interface Youtuber {
    public void register(Observer subscriber);
    public void notifySubscribers();
    public void removeSubscriber(Observer subscriber);
}

 

Youtuber1 클래스

public class Youtuber1 implements Youtuber{
    static List<Observer> subscribers = new ArrayList<>();

    @Override
    public void register(Observer subscriber){
        subscribers.add(subscriber);
    }

    @Override
    public void notifySubscribers(){
        for (Observer subscriber : subscribers) {
            subscriber.update();
        }
    }

    @Override
    public void removeSubscriber(Observer subscriber) {
        subscribers.remove(subscriber);
    }
}

 

Observer(인터페이스)

public interface Observer {
    public void update();
}

 

Subscriber1, Subscriber2 클래스(옵저버)

public class Subscriber1 implements Observer{

    @Override
    public void update() {
        System.out.println("Subscriber1 Play Youtube!");
    }
}

public class Subscriber2 implements Observer {

    @Override
    public void update() {
        System.out.println("Subscriber2 Play Youtube!");
    }
}

 

옵저버 테스트

public class testObserver {
    public static void main(String[] args) {
        Observer sub1 = new Subscriber1();
        Observer sub2 = new Subscriber2();
        Youtuber youtuber = new Youtuber1();

        youtuber.register(sub1);
        youtuber.notifySubscribers();
        System.out.println();
        youtuber.register(sub2);
        youtuber.notifySubscribers();
    }
}

 

실행 결과

옵저버 패턴 언제 사용할까?

  • 외부에서 발생한 이벤트에 대한 응답(Swing, Android 등 UI 관련된 곳)
  • MVC 패턴

MVC 패턴과 옵저버 패턴

  • 모델(Model)은 사용자의 모든 데이터를 가지고 있으며, 뷰나 컨트롤러에 대한 정보를 알지 못한다.
  • 모델은 변경이 일어나면 이를 컨트롤러에 알려 뷰에게 알린다.
  • 뷰(View)모델이나 컨트롤러에 대한 정보를 알지 못한다.
  • 즉, 모델에 변경이 일어나면 이를 구독하고 있는 뷰들에게 알린다.(옵저버 패턴)

 

 

 

 

 

 


참고

https://huimang2.github.io/design-pattern/mvc-pattern.html

 

MVC 패턴

MVC 패턴이란? MVC 패턴(Model-View-Controller Pattern)은 어플리케이션을 개발함에 있어서 컴포넌트를 모델(Model), 뷰(View), 컨트롤러(Controller)로 역할을 나누어 개발하는 디자인 패턴 즉, 설계 방식을 말합

huimang2.github.io

https://www.crocus.co.kr/1530

 

옵저버 패턴(Observer Pattern)

옵저버 패턴(Observer Pattern) 한객체의 상태가바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다. 즉, A 오브젝트가

www.crocus.co.kr

 

'CS > Design Pattern' 카테고리의 다른 글

프로토타입 패턴(Prototype Pattern)  (0) 2023.11.02
커맨드 패턴(Command Pattern)  (0) 2023.04.05
노출 모듈 패턴(Revealing Module Pattern)  (0) 2023.04.05