옵저버 패턴이란
주체가 어떤 객체의 상태 변화를 관찰하다가
상태 변화가 있을 때마다 메서드 등을 통해
옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다
쉽게 말해서
서로의 정보를 주고 받는 과정에서 정보의 단위가 클수록
객체들의 규모가 클수록 복잡성이 증가하게 되는데
이때 가이드라인을 제시해주는것이 옵저버 패턴이다
예를 들어
신문배달업체 와 고객을 예시로 들 수 있다
고객은 정보를 얻거나 받아야 하는 주체(신문배달업체)와 관계를 형성하게 된다
관계가 지속되다가 정보를 원하지 않으면 해제할 수도 있다
이때 객체와의 관계를 맺고 끊는 상태 변경 정보를 옵저버에 알려줘서 관리한다
코드로 보자면
Publisher 인터페이스로 옵저버들을 관리하는 메서드들을 가지고 있다
public interface Publisher {
public void add(Observer observer);
public void delete(Observer observer);
public void notifyObserver();
}
Observer 인터페이스로 정보를 업데이트 하는 메서드를 가지고 있다
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);
}
}
정리하자면
옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고
자동으로 정보가 갱신되는 1 : N (혹은 1 : 1)를 정의한다
인터페이스를 통해 연결하여 느슨한 결합성을 유지하며 Publisher와 Observer 인터페이스를 적용한다
'항해99 개발일지' 카테고리의 다른 글
[항해99] 31일차 (TIL : 주특기 심화 Spring) (0) | 2022.10.19 |
---|---|
[항해99] 30일차 (TIL : 주특기 심화 Spring) (0) | 2022.10.18 |
[항해99] 29일차 (TIL : 주특기 심화 Spring) (0) | 2022.10.17 |
[항해99] 28일차 (WIL : 주특기 심화 Spring) (0) | 2022.10.17 |
[항해99] 27일차 (TIL : 주특기 심화 Spring) (0) | 2022.10.17 |