옵저버패턴 : 객체(주체)가 객체(옵저버)를 등록하여 객체 목록들을 유지하고, 주체에 상태 변화가 있을 때마다 메서드등을 통해 옵저버에게 통지하는 디자인패턴입니다. 알림의 주제, 데이터 등 전달할 때 필요
간단하게 Publisher는 객체 등록, 삭제, 알림을 할 수 있다. 각 인터페이스를 구현하고 클래스를 implement하여 구현한다.
Observer의 notify method는 News가 새로운 뉴스를 발간할 때 마다 notifyObserver()를 호출하며 notify가 호출된다.
Publisher 인터페이스
public interface Publisher {
public void add(Observer observer);
public void delete(Observer observer);
public void notifyObserver();
}
Observer 인터페이스
public interface Observer {
public void notify(String title, String news);
}
News 클래스
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.notify(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 클래스
public class AnnualSubscriber implements Observer {
private String newsString;
private Publisher publisher;
public AnnualSubscriber(Publisher publisher) {
this.publisher = publisher;
publisher.add(this);
}
@Override public void notify(String title, String news) {
this.newsString = title + " \n -------- \n " + news;
display();
}
private void display() {
System.out.println("오늘의 뉴스" + newsString);
}
}
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 notify(String title, String news) {
newsString = title + news;
display();
}
public void display() {
System.out.println("이벤트 유저");
System.out.println("newsString);
}
}
main함수
public class MainClass {
public static void main(String[] args) {
News news = new News();
AnnualSubscriber as = new AnnualSubscriber(News);
EventSubscriber es = new EventSubscriber(News);
newsMachine.setNewsInfo("오늘 한파", "전국 영하 18도 입니다."); } }
출력본