[Design Pattern] 옵저버 패턴(Observer Pattern)

in·2023년 10월 16일
0

Design Pattern

목록 보기
6/8

옵저버 패턴(Oberver Pattern)

상태를 가지고 있는 주체 객체 & 상태의 변경을 알아야 하는 관찰 객체
(어떤 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 디자인 패턴이며 1 대 1 or 1 대 N 관계)

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

장점

  • 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다.
  • 느슨한 결합으로 시스템이 유연하고 객체 간의 의존성을 제거할 수 있다.

✔️ 느슨한 결합(Loose Coupling)
다른 클래스를 직접적으로 사용하는 클래스의 의존성을 줄이는 것을 말한다.
시스템을 더욱 유지할 수 있도록 만들고 전체 프레임워크를 더욱 안정적으로 만들고 시스템의 유연성을 증가하게 하려는 의도를 가진 포괄적인 개념이다.

단점

  • 너무 많이 사용할 경우 상태 관리가 힘들 수 있다.
  • 데이터 배분에 문제가 발생하면 큰 문제로 발전할 수 있다.

Publisher 인터페이스

  • Oberver들을 관리하는 메소드를 가지고 있음
  • 옵저버 등록(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 클래스)

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

정리

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

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

[참고 자료]

🔗링크
🔗링크

0개의 댓글