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

활동하기