[디자인패턴 수업 7주차 1차시] Observer pattern intro

Jin Hur·2021년 10월 7일
0
post-custom-banner

Publisher 인터페이스와 Observer 인터페이스

  • Publisher 인터페이스는 옵저버(관찰자)를 등록/삭제하고, 무언가를 알리는 기능을 정의한다.
  • Observer 인터페이스는 Publisher로 부터 새로운 정보를 받는 기능이 있다.
  • Publisher의 notify() 메서드에서 자신의 옵저버들의 update()를 호출하여 무언가를 알린다. 옵저버는 자동적으로 새로운 정보를 갱신받게 된다.


1) Publisher 인터페이스를 구현한 NewsMachine 클래스

2) Observer 인터페이스를 구현한 연간 구독자, 이벤트 구독자 클래스

뉴스머신 클래스

// 뉴스머신 클래스
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 idx = observers.indexOf(observer);
        observers.remove(idx);
    }

    // 구독자에게 알림 == 구독자의 update() 메서드 호출
    @Override
    public void notifyToObserver() {
        // 각 옵저버들에게 새로운 뉴스를 알린다.
            for(Observer observer : observers)
                observer.update(title, news);
    }

    // 새로운 뉴스정보 갱신, 외부로부터 가져올 수 있음
    // 새로운 뉴스가 생기면 구독자에게 알린다(notifyToObserver)
    public void renewNewsInfo(String title, String news){
        this.title = title;
        this.news = news;
        notifyToObserver();
    }
    
    public String getTitle(){
        return  title;
    }
    public String getNews() {
        return news;
    }
}

연간 구독자 클래스

// 퍼블리셔로부터 뉴스를 구독받는 연간 구독자 클래스
public class AnnualSubscriber implements Observer{
    private String  newsString;
    private Publisher publisher;

    // 옵저버를 생성할 시 관찰 대상 또는 알림을 받을 퍼블리셔에 등록을 요청한다.
    public AnnualSubscriber(Publisher publisher){
        this.publisher = publisher;
        publisher.add(this);    // 자신 등록 요청
    }

    @Override
    public void update(String title, String news) {
        this.newsString = title + " === " + news;

        // 옵저버 자신들의 서로 다른 작업. ex) display()
        display();
    }

    private void display(){
        System.out.println("오늘의 뉴스" + newsString);
    }
}
post-custom-banner

0개의 댓글