본문 바로가기

java

[JAVA]옵저버 패턴 예제

옵저버 패턴으로 트위터 같은 커스터 마이즈된 알림 시스템을 설계하고 구현할 수 있다. 

다양한 신문 매체(뉴욕 타임즈, 가디언, 르몽드)가 뉴스 트윗을 구독하고 있으며 특정 키워드를 포함하는 트윗이 등록되면 알림을 받고 싶어한다. 

 

우선 다양한 옵저버를 그룹화할 Observer 인터페이스가 필요하다. Observer 인터페이스는 새로운 트윗이 있을때 주제(Feed) 가 호출할 수 있도록 notify라고 하는 하나의 메서드를 제공한다. 

 

public interface Observer {
    void notify(String tweet);
}
public class NYTimes implements Observer {
    @Override
    public void notify(String tweet) {
        if(tweet != null && tweet.contains("money")) {
            System.out.println("Breaking news in NY! " + tweet);
        }
    }
}

public class Guardian implements Observer {
    @Override
    public void notify(String tweet) {
        if(tweet != null && tweet.contains("queen")) {
            System.out.println("Yet more news from Londen..." + tweet);
        }
    }
}


public class LeMonde implements Observer {
    @Override
    public void notify(String tweet) {
        if(tweet != null && tweet.contains("wine")) {
            System.out.println("Today cheese, wine and news! " + tweet);
        }
    }
}

주제는 registerObserver 메서드로 새로운 옵저버를 등록한 다음에 notifyObservers 메서드로 트윗의 옵저버에 이를 알린다. 

 

public interface Subject {
    void registerObserver(Observer o);
    void notifyObserver(String tweet);
}

 

public class ObserverTest {
    static class  Feed implements Subject{
        private final List<Observer> observers = new ArrayList<>();

        @Override
        public void registerObserver(Observer o) {
            this.observers.add(o);
        }

        @Override
        public void notifyObserver(String tweet) {
            observers.forEach(o -> o.notify(tweet));
        }
    }

    public static void main(String[] args) {
        Feed feed = new Feed();
        feed.registerObserver(new NYTimes());
        feed.registerObserver(new Guardian());
        feed.registerObserver(new LeMonde());
        feed.notifyObserver("The queen said her favourite boot is ModernJava in Action");

    }
}
반응형