본문 바로가기

Pattern/GOF

행위패턴 - 옵저버패턴

반응형

1. 옵저버 패턴이란?

옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다. (PUB/SUB)

 

쉽게 말해, 유튜버들이 새로운 영상을 올렸을 때 구독자들에게 알림을 보내주는 것이라 생각하면 된다.

사용자가 유튜버 채널에 구독 -> 유튜버가 채널에 새로운 영상 업로드 -> 해당 채널을 구독한 사람들에게 이벤트 통지

 

2. 샘플코드

자바에서 기본적으로 Observer 인터페이스와 Observable 클래스를 제공하지만 패턴을 직접 만들어 보는게 목적이므로 새롭게 정의하겠다.

 

Subscriber

public interface Subscriber
{
    void handleEvent();
}

UML에서 Observer의 역할을 한다.

 

Computer, Notebook

public class Computer implements Subscriber {

    public static final String KEY = Computer.class.getName();

    @Override
    public void handleEvent() {
        System.out.println("Computer");
    }
}
public class Notebook implements Subscriber {

    public static final String KEY = Notebook.class.getName();


    @Override
    public void handleEvent() {
        System.out.println("Notebook");
    }
}

ConcreteObserverA,  ConcreteObserverB 역할을 한다.

 

Publisher

public class Publisher
{
    private Map<String, List<Subscriber>> mSubscribers = new HashMap<>();

    public void register(String key, Subscriber event)
    {
        if (mSubscribers.containsKey(key)) {
            mSubscribers.get(key).add(event);
        } else {
            List<Subscriber> events = new ArrayList<>();
            events.add(event);
            mSubscribers.put(key, events);
        }
    }

    public void unRegister(String key, Subscriber event)
    {
        if (mSubscribers.containsKey(key))
        {
            mSubscribers.get(key).remove(event);
        }
    }

    public void notifyEvent(String key)
    {
        mSubscribers.get(key).forEach(Subscriber::handleEvent);
    }
}

UML에서 Subject이다.

기본적으로 주제를 등록하고, 해제하고, 통지하는 함수가 있어야 한다.

 

Client

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

        Subject subject = new Subject(); // 통지자 생성

        // 구독 등록
        Computer computer1 = new Computer();
        Computer computer2 = new Computer();

        Notebook notebook1 = new Notebook();
        Notebook notebook2 = new Notebook();

        subject.register(Computer.KEY, computer1);
        subject.register(Computer.KEY, computer2);
        subject.register(Notebook.KEY, notebook1);
        subject.register(Notebook.KEY, notebook2);
        // 구독 등록

        // 구독 해제
        subject.unRegister(Notebook.KEY, notebook1);
        // 구독 해제


        subject.notifyEvent(Computer.KEY);
        subject.notifyEvent(Notebook.KEY);
    }
}

 

결과

반응형

'Pattern > GOF' 카테고리의 다른 글

행위패턴 - 책임 연쇄 패턴  (0) 2022.05.31
구조패턴 - 프록시  (0) 2022.05.26
구조패턴 - 데코레이션 패턴  (0) 2022.05.24
구조패턴 - 컴포짓패턴  (0) 2022.05.23
생성패턴 - 팩토리메서드  (0) 2022.05.11