CS(Computer Science)/Design Pattern

옵저버 패턴

환성 2023. 1. 12. 21:58
728x90

 

정의

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

주제 객체와 상태 변경을 알아야 하는 관찰 객체가 존재하며 1 대 1 or 1 대 N 관계이고

다른 객체의 상태가 변경될 때마다 어떤 이벤트를 실행하고 싶을 때 사용된다.

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

주로 분산 이벤트 핸들링 시스템을 구현하는데 사용된다.

추가로 MVC(Model-View Controller)패턴에 자주 사용된다.

느슨한 결합성

  • 두 객체가 상호작용을 하지만 서로에 대해서 잘 모른다는 것을 의미한다.
  • 옵저버는 언제든지 추가할 수 있고, 주제와 옵저버는 서로 독립적으로 재사용할 수 있고, 서로한테 영향을 미치지 않는다.
  • 즉, 변경 사항이 생기더라도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있어서 사용한다.
  • 추가로, 객체 사이의 상호의존성을 최소화할 수 있기 때문이다.

 

주체 객체, 관찰 객체?

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

Publisher 인터페이스

Observer를 관리하는 메소드를 가지고 있다.
옵저버 등록(add), 제외(delete), 옵저버에게 정보를 알려주는(notifyObserver) 3개의 메소드가 있다.
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; 
    }
}

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);
    }
    
}

 

장점

  • 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다.
  • 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다.
  • 개방 폐쇄 원칙을 지킬 수 있다(확장에는 열려있고, 변경에듣 닫혀있어야 하는 SOLID 원칙 중 하나)

 

단점

  • 너무 많으면 상태 관리가 힘들 수 있다.
  • 데이터 배분에 문제가 생길 수 있다.

 

 

 

 

 

 

 

 

 

 

 

출처:
https://gyoogle.dev/blog/design-pattern/Observer%20Pattern.html

'CS(Computer Science) > Design Pattern' 카테고리의 다른 글

팩토리 메소드 패턴  (0) 2023.01.09
템플릿 메소드 패턴  (0) 2023.01.09
싱글톤 패턴  (0) 2023.01.08
어댑터 패턴  (0) 2023.01.08