본문 바로가기

Design Pattern

1. Observer Pattern

요약: Observable 객체가 Observer 객체들에게 자신의 상태 변화가 있을때 알려주는 패턴, Observable 객체의 변화가 있을때, 직접 Observable 객체가 Observable 객체에 등록된 Observer 객체들에게 직접 알려주기 위해 설계된 패턴이다.

 

샘플 코드 : Observable (Youtube, AfreecaTV, Twitch... ), Observer (구독자) 인 상황으로 작성해봤다. (Java Code)

public interface Observable {
    void subscribe(Observer observer); // 구독
    void unsubscribe(Observer observer); // 구독 해제
    void alarm(); // 알림
}

Observable interface는 구독, 구독해제, 알림에 관한 코드를 구현해야 한다.

public interface Observer {
    void subscribe(Observable observable);
    void unsubscribe(Observable observable);
    void task();
}

Observer interface는 구독, 구독해제, 알림이 왔을때 실행하는 코드를 구현해야 한다.

import java.util.ArrayList;
import java.util.List;

public class Youtube implements Observable {

    private List<Observer> observerList;

    public Youtube () {
        this.observerList = new ArrayList<>();
    }

    @Override
    public void subscribe(Observer observer) {
        this.observerList.add(observer);
    }

    @Override
    public void unsubscribe(Observer observer) {
        this.observerList.remove(observer);

    }

    @Override
    public void alarm() {
        this.observerList.forEach(Observer::task);

    }
}

Observable 구현체인 Youtube 클래스 이다. unsubscribe 메소드는 편의상 remove(Object object) 를 사용했는데, 실제로는 정확한 remove 로직을 구현해야한다. 

public class Subscriber implements Observer {

    private String nickname;

    public Subscriber (String nickname) {
        this.nickname = nickname;
    }

    @Override
    public void subscribe(Observable observable) {
        observable.subscribe(this);
    }

    @Override
    public void unsubscribe(Observable observable) {
        observable.unsubscribe(this);
    }

    @Override
    public void task() {
        String text = String.format("nickname: %s", nickname);
        System.out.println(text);
    }
}

Observer 구현체인 Subscriber(구독자) 클래스 이다. 구독자는 자기가 구독할 것(ex: Youtube, Twitch..)을 선택할 수 있고, 구독했던것중 일부를 구독해제 할 수 있고, 알림이오면 실행할 메소드를 정의할 수 있다.

public class Executor {

    public static void main(String[] args) {
        Observable youtube = new Youtube(); 
        Observer user1 = new Subscriber("user1");
        Observer user2 = new Subscriber("user2");
        Observer user3 = new Subscriber("user3");
        user1.subscribe(youtube);
        user2.subscribe(youtube);
        user3.subscribe(youtube);
        youtube.alarm();
        user2.unsubscribe(youtube);
        youtube.alarm();
    }
}

메인 클래스 이다.
Youtube 객체가 만들어 지고, user1, user2, user3 이 Youtube를 구독하고,
Youtube가 알림을 구독자들에게 보낸다.
user2가 구독해제를 하고, Youtube가 알림을 보내는 상황을 작성한 클래스 이다.

'Design Pattern' 카테고리의 다른 글

2. Decorator Pattern  (0) 2020.05.07