행위 패턴 - Observer

이유석·2022년 9월 17일
0

Design Pattern

목록 보기
9/10
post-thumbnail
post-custom-banner

Observer 패턴

정의

  • 객체(발행자)의 상태 변화를 관찰하는 Observer(관찰자, 구독자)들의 목록을 객체에 등록하여, 상태 변화가 있을 때 마다 notify(알림)를 통해 객체의 Observer들의 목록에 있는 각 Observer에게 통지하도록 하는 디자인 패턴이다.

특징

  • 발행 / 구독 모델로도 알려져 있기도 하다.

  • Observer 패턴은 인터페이스를 통해 연결하여 느슨한 결합성을 유지하며 MVC(Model - View - Controller) 패러다임과 자주 연결된다.

  • Java 에서는 Observer 패턴을 적용한 기본적인 인터페이스와 클래스를 제공한다.

    • Observer 인터페이스, Observable 클래스
    • Observable 클래스는 Java의 특성상 다중 상속이 불가능하다.

예제 코드

AnnualSubscriber(연간 구독자)는 NewsMachine을 구독하여 NewsMachine의 상태가 변화할 때 마다 notify(알림)를 받는다.

Publisher.java

public interface Publisher {

	public void add(Observer observer);
    public void delete(Observer observer);
    public void notify();

}
  • Observer 들을 관리하는 메소드들을 가지고 있다.
    Observer 등록(add), 제외(delete), Observer 들에게 정보를 알려줌(notify)

Observer.java

public interface Observer {

	public void update(String title, String news);
}
  • Observer 를 구현한 AnnualSubscriber가 갖고있는 정보를 업데이트 해준다.

NewsMachine.java

public class NewsMachine implements Publisher {

	private ArrayList<Observer> observerList;
    private String title;
    private String news;
    
    public NewsMachine() {
    	observerList = 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 notify() {
        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; }
}
  • Publisher 를 구현한 클래스로, 정보를 제공해준다.

AnnualSubscriber.java

public class AnnualSubscriber 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);
    }
    
}
  • Observer 를 구현한 클래스이다.
    Publisher에서 notify 함수를 호출하면, Publisher를 구독한 Observer 들의 update 함수가 호출된다.
profile
소통을 중요하게 여기며, 정보의 공유를 통해 완전한 학습을 이루어 냅니다.
post-custom-banner

0개의 댓글