ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 디자인 패턴(4)_옵저버 패턴
    Java 2023. 11. 6. 16:59

    옵저버 패턴

    • 객체의 상태 변화를 보고있는 관찰자(주체)가 어떤 객체의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 추가 변화 사항이 생기는 객체들(옵저버들)에게 변화를 알리는 패턴
    • MVC 패턴에서 사용된다.
      • Model에서 변경사항이 생겨 옵저버인 View에게 알려주고 이를 기반으로 Controller가 동작한다.
    // topic을 기반으로 옵저버 패턴을 구현 - Observer a = new TopicSubscriber("a", topic);으로 해당 이름과 어떤 topic의 옵저버가 될지 결정
    import java.util.*;
    
    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 sended 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+" :: message >> " + msg);
        }
    }
    
    public class HelloWorld{
         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);
            
            /*
            message sended to topic : ###
            a :: message >> ###
            b :: message >> ###
            c :: message >> ###
            */
            topic.postMessage("###");
         }
    }

     

     

    출처)

    책 : 면접을 위한 CS 전공지식 노트

Designed by Tistory.