# 옵저버 패턴(Observer pattern)



상태를 가지고 있는 주체 객체 & 상태의 변경을 알아야 하는 관찰 객체


(1 대 1 or 1 대 N 관계)

서로의 정보를 주고받는 과정에서 정보의 단위가 클수록, 객체들의 규모가 클수록 복잡성이 증가하게 된다. 이때 가이드라인을 제시해줄 수 있는 것이 '옵저버 패턴'


# 주체 객체와 관찰 객체의 예는?

잡지사 : 구독자
우유배달업체 : 고객

구독자, 고객들은 정보를 얻거나 받아야 하는 주체와 관계를 형성하게 된다. 관계가 지속되다가 정보를 원하지 않으면 해제할 수도 있다. (잡지 구독을 취소하거나 우유 배달을 중지하는 것처럼)

이때, 객체와의 관계를 맺고 끊는 상태 변경 정보를 Observer에 알려줘서 관리하는 것을 말한다.



  • # Publisher 인터페이스

    Observer들을 관리하는 메소드를 가지고 있음

    옵저버 등록(add), 제외(delete), 옵저버들에게 정보를 알려줌(notifyObserver)


    public interface Publisher { 
        public void add(Observer observer); 
        public void delete(Observer observer); 
        public void notifyObserver(); 
    }
    

  • # Observer 인터페이스

    정보를 업데이트(update)


    public interface Observer { 
        public void update(String title, String news); }
    

  • # NewsMachine 클래스

    Publisher를 구현한 클래스로, 정보를 제공해주는 퍼블리셔가 됨


    public class NewsMachine implements Publisher {
        private ArrayList<Observer> observers; 
        private String title; 
        private String news; 
    
        public NewsMachine() {
            observers = new ArrayList<>(); 
        }
        
        @Override public void add(Observer observer) {
            observers.add(observer);
        }
        
        @Override public void delete(Observer observer) 	{ 
            int index = observers.indexOf(observer);
            observers.remove(index); 
        }
        
        @Override public void notifyObserver() {
            for(Observer observer : observers) {
               observer.update(title, news); 
            }
        } 
        
        public void setNewsInfo(String title, String news) { 
            this.title = title; 
            this.news = news; 
            notifyObserver(); 
        } 
        
        public String getTitle() { return title; } 		public String getNews() { return news; }
    }
    

  • # AnnualSubscriber, EventSubscriber 클래스

    Observer를 구현한 클래스들로, notifyObserver()를 호출하면서 알려줄 때마다 Update가 호출됨


    public class EventSubscriber implements Observer {
        
        private String newsString;
        private Publisher publisher;
        
        public EventSubscriber(Publisher publisher) {
            this.publisher = publisher;
            publisher.add(this);
        }
        
        @Override
        public void update(String title, String news) {
            newsString = title + " " + news;
            display();
        }
        
        public void withdraw() {
            publisher.delete(this);
        }
        
        public void display() {
            System.out.println("이벤트 유저");
            System.out.println(newsString);
        }
        
    }
    


Java에는 옵저버 패턴을 적용한 것들을 기본적으로 제공해줌

Observer 인터페이스, Observable 클래스

하지만 Observable은 클래스로 구현되어 있기 때문에 사용하려면 상속을 해야 함. 따라서 다른 상속을 함께 이용할 수 없는 단점 존재



# 정리

옵저버 패턴은, 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고, 자동으로 정보가 갱신되는 1:N 관계(혹은 1대1)를 정의한다.

인터페이스를 통해 연결하여 느슨한 결합성을 유지하며, Publisher와 Observer 인터페이스를 적용한다.

안드로이드 개발시, OnClickListener와 같은 것들이 옵저버 패턴이 적용된 것 (버튼(Publisher)을 클릭했을 때 상태 변화를 옵저버인 OnClickListener로 알려주로독 함)



# [참고 자료]

최종 수정 : 12/17/2022, 7:23:59 AM