디자인 패턴 - 옵저버 패턴

hyuko·2022년 11월 14일
0

책 공부/CS기본

목록 보기
3/7

1.1.4 옵저버 패턴

옵저버 패턴은 주체가 어떤 객체의 상태 변화를 관찰하다가
상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는
옵저버들에게 변화를 알려주는 디자인 패턴이다.

옵저버 패턴에는 객체와 주체가 분리되어 있는 옵저버 패턴과
객체와 주체가 합쳐져 있는 옵저버 패턴으로 나뉜다.

※ 여기서 주체라는 것은
객체의 상태 변화를 보고 있는 관찰자 이고,
옵저버 들이란 객체의 상태 변화에 따라 전달되는 메서드등을
기반으로 추가 변화 사항이 생기는 객체를 의미한다.

옵저버 패턴을 활용한 서비스로는 트위터가 있습니다.

예를 들어 나 자신 user가 어떤 다른사람인 주체를 팔로우 했다면
그 주체가 포스팅을 올리게 되면 알림이 팔로워에게 가게 됩니다.

그리고 이 옵저버 패턴은 주로 이벤트 기반 시스템에 사용되며
MVC(Model - View - Controller) 패턴에도 사용된다.

여기서 주체라고 볼 수 있는 모델에서 변경 사항이 생기면 update()라는
메서드를 통해서 옵저버인 view객체에 전달을 하고 이를 기반으로
controller가 작동하게 되는 원리이다.

옵저버 패턴을 사용한 자바 코드를 보겠습니다

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

interface Subject{
    public void register(Observer obj);
    public void unregister(Observer obj);
    public void notifyObservers();
    public Object getUpdate(Observer obj);
}

interface Observer{
    public void update();
}

class Topic implements Subject{
    private List<Observer> observers;
    private String message;

    public Topic() {
        this.observers = new ArrayList<>();
        this.message ="";
    }

    @Override
    public void register(Observer obj) {
        if(!observers.contains(obj)) observers.add(obj);
    }

    @Override
    public void unregister(Observer obj) {
        observers.remove(obj);
    }

    @Override
    public void notifyObservers() {
        this.observers.forEach(Observer::update);
    }

    @Override
    public Object getUpdate(Observer obj) {
        return this.message;
    }

    public void postMessage(String msg){
        System.out.println("Message sended to Topic: " + msg);
        this.message = msg;
        notifyObservers();
    }
}

class TopicSubscriber implements Observer{

    private String name;
    private Subject topic;

    public TopicSubscriber(String name, Subject topic) {
        this.name = name;
        this.topic = topic;
    }

    @Override
    public void update() {
        String msg = (String) topic.getUpdate(this);
        System.out.println(name + ":: got message >> " + msg);
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        Topic topic = new Topic();
        Observer a = new TopicSubscriber("a", topic);
        Observer b = new TopicSubscriber("b", topic);
        Observer c = new TopicSubscriber("c", topic);
        topic.register(a);
        topic.register(b);
        topic.register(c);

        topic.postMessage("amumu is op champion!!");
    }
}

위의 코드에서는 topic이라는 객체를 기반으로 옵저버 패턴을 구성
하였습니다. 여기서 topic은 주체이자 객체입니다.
Topic에 Subject인터페이스를 구현을 했고 메인 클래스에서
옵저버를 선언할 때에 해당 이름과 어떠한 토픽의 옵저버가 될 것인지
정의했습니다.

여기서 알아보는 자바의 상속과 구현

상속: 자식클래스가 부모 클래스의 메서드등을 상속받아 사용하게되고
자식 클래스에서 추가 및 확장을 할 수 있는 것을 말하고
이로 인해 재사용성, 중복성의 최소화가 이루어진다.

구현(Implements): 부모 인터페이스를 자식 클래스에서 재정의하여
구현하는 것을 말하며, 상속과는 달리 반드시 부모 클래스의 메서드를
재정의 해서 구현해야 한다.

상속은 abstract를 통해 상속을 하고 인터페이스는 implements를 통해 구현합니다.

profile
백엔드 개발자 준비중

0개의 댓글