상태를 가지고 있는 주체 객체 & 상태의 변경을 알아야 하는 관찰 객체
(어떤 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 디자인 패턴이며 1 대 1 or 1 대 N 관계)
서로의 정보를 주고 받는 과정에서 정보의 단위가 클수록 객체들의 규모가 클수록 복잡성이 증가하게 된다. 이때 가이드라인을 제시해줄 수 있는 것이 ‘옵저버 패턴’
✔️ 느슨한 결합(Loose Coupling)
다른 클래스를 직접적으로 사용하는 클래스의 의존성을 줄이는 것을 말한다.
시스템을 더욱 유지할 수 있도록 만들고 전체 프레임워크를 더욱 안정적으로 만들고 시스템의 유연성을 증가하게 하려는 의도를 가진 포괄적인 개념이다.
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;
}
}
AnnualSubscriber, EventSubscriber 클래스
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 인터페이스를 적용한다.
[참고 자료]