ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인 패턴] 옵저버 패턴 (Observer Pattern)
    Computer Science/Design Pattern 2022. 12. 13. 16:51
    반응형

    옵저버 패턴이란?

    : 주체가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴

    - 주체: 객체의 상태 변화를 보고 있는 관찰자
    - 옵저버: 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로 '추가 변화 사항'이 생기는 객체

    - 한 객체의 상태 변화에 따라 다른 객체 상태도 연동되도록 1:N 의존 관계를 구성
    - Java는 기본적으로 옵저버 패턴을 적용한 Observer 인터페이스, Observable 클래스를 제공 (Observable은 상속을 해야하기 때문에 다른 상속을 함께 사용할 수 없는 단점 존재)

    [ 구현 방법 ]

    interface Subject {
      public void register(Observer obj);
      public void unregister(Observer obj);
      public void notifyObservers();
      public Object getUpdate(Observer obj);
    }
    
    interface Observer {
      public void update();
    }
    
    // 주체이자 객체
    class Topic implements Subject {
    
      private List<Observer> observers;
      private String message;
     
      public Topic() {
        this.observers = new ArrayList<>();
        this.message = "";
      }
     
      @Override
      public void register(Observer obj) {
        if(!observers.contains(obj)) observers.add(obj);
      }
     
      @Override
      public void unregister(Observer obj) {
        observers.remove(obj);
      }
     
      @Override
      public void notifyObservers() {
        this.observers.forEach(Observer::update);
      }
     
      @Override
      public Object getUpdate(Observer obj) {
        return this.message;
      }
     
      public void postMessage(String msg) {
        System.out.println("Message send to Topic: " + msg);
        this.message = msg;
        notifyObservers();
      }
    }
    
    class TopicSubscriber implements Observer {
      private String name;
      private Subject topic;
      
      public TopicSubscriber(String name, Subject topic) {
        this.name = name;
        this.topic = topic;
      }
      
      @Override
      public void update() {
        String msg = (String) topic.getUpdate(this);
        System.out.println(name + ":: got message >> " + msg);
      }
    }
    
    public class Test {
      public static void main(String[] args) {
        Topic topic = new Topic();
        Observer a = new TopicSubscriber("a", topic);
        Observer b = new TopicSubscriber("b", topic);
        Observer c = new TopicSubscriber("c", topic);
        topic.register(a);
        topic.register(b);
        topic.register(c);
        topic.postMessage("hello!");
      }
    }
    
    /* 
    * 객체가 변경될 때마다 작동!
    */
    반응형

    댓글

Designed by Tistory.