정의
발행 / 구독 모델로도 알려져 있기도 하다.
Observer 패턴은 인터페이스를 통해 연결하여 느슨한 결합성을 유지하며 MVC(Model - View - Controller) 패러다임과 자주 연결된다.
Java 에서는 Observer 패턴을 적용한 기본적인 인터페이스와 클래스를 제공한다.
AnnualSubscriber(연간 구독자)는 NewsMachine을 구독하여 NewsMachine의 상태가 변화할 때 마다 notify(알림)를 받는다.
Publisher.java
public interface Publisher {
public void add(Observer observer);
public void delete(Observer observer);
public void notify();
}
Observer.java
public interface Observer {
public void update(String title, String news);
}
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; }
}
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);
}
}