You will be fine

<디자인패턴입문> 14. Observer 패턴

by BFine
반응형

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

 

가. 무엇인가

 a. 지켜보고 있다!

  -  옵저버 패턴은 관찰 대상의 상태가 변화하면 관찰자에게 알려줍니다.

  -  어떤 상태 변화에 따른 처리를 해야할때 효과적인 패턴이다

 

나. 만들어본 예제

유튜버가 영상을 업로드하면 구독자에게 알림이 가는 예제

 a. Suject(관찰 대상자)의 역할

  -  관찰되는 대상을 나타낸다. 그리고 관찰자 등록과 삭제하는 메서드를 가지고 있다. 

public abstract class Subject {

    List<Observer>  observerList = new ArrayList<>();

    protected final void addObserver(Observer observer){
        observerList.add(observer);
    }

    protected final void removeObserver(Observer observer){
        observerList.remove(observer);
    }

    public abstract void notifyObservers();
    public abstract void upload();

}

 b. ConcreteSubject(구체적인 관찰 대상자)의 역할 

  -  상태가 변화하면 등록되어있는 관찰자들에게 전달하는 역할을 한다.

  -  예제에서는 YouTuberSubject가 upload 메서드를 호출시 구독자에게 알리는 부분이다.

public class SubscriberObserver implements Observer{

    private String id;
    public SubscriberObserver(String id) {
        this.id = id;
    }

    @Override
    public void notice() {
        System.out.println(id +" : 영상 업로드 PUSH 알림받음");
    }
}

 c. Observer(관찰자)의 역할

  -  상태가 변했습니다 라고 전달받는 역할을 담당한다.  

package observer;

public interface Observer {
    void notice();
}

 d. ConcreteObserver(구체적인 관찰자)의 역할

  -  ConcreteSubject 에서 상태변화를 알려주는 창구인 메서드를 구현한다. 예제에서는 notice가 해당부분이다. 

public class YouTuberSubject extends Subject {


    public void subscribe(SubscriberObserver observer){
        super.addObserver(observer);
    }

    public void unsubscribe(SubscriberObserver observer){
        super.removeObserver(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observerList) {
            observer.notice();
        }
    }

    @Override
    public void upload() {
        notifyObservers();
    }
}

 e. Main

public class Main {
    public static void main(String[] args) {

        YouTuberSubject youTuber = new YouTuberSubject();

        SubscriberObserver subscriber1 = new SubscriberObserver("sub1");
        SubscriberObserver subscriber2 = new SubscriberObserver("sub2");
        SubscriberObserver subscriber3 = new SubscriberObserver("sub3");

        youTuber.subscribe(subscriber1);
        youTuber.subscribe(subscriber2);
        youTuber.subscribe(subscriber3);

        youTuber.upload();

    }
}

/*
"C:\Program Files\Java\jdk1.8.0_251\bin\java.exe"
sub1 : 영상 업로드 PUSH 알림받음
sub2 : 영상 업로드 PUSH 알림받음
sub3 : 영상 업로드 PUSH 알림받음
*/

 

다. 정리

 a. 관찰하기보다 전달받길 기다린다. 

  -  실제로 Observer는 능동적인 관찰이 아닌 Subject로부터 전달되는것을 수동적으로 기다린다.

  -  그래서 Observer(옵저버) 패턴은 Publish(발행)-Subscribe(구독) 패턴이라고도 한다.

  -  즉 Subject의 상태변화를 Observer들에게 알려서 동기화를 이루는 일에 주안점을 두는 패턴이다.

Observer 패턴은 관찰 대상 객체의 상태변화를 등록된 관찰자 객체들에게 알리는 패턴이다. 
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기