본문 바로가기
Theory/Design Pattern

Observer Pattern

by y.j 2022. 5. 21.
728x90

Observer Pattern

object사이에 one-to-many 의존성을 정의하여 one object가 변경될 때 이것을 의존하고 있는 모든 object들을 자동적으로 업데이트 및 통지하는 것이다.

어떻게 one-to-many object들 사이에 의존성을 강한 결합없이 정의 할 수 있을까?
어떻게 one object가 many object에게 통지 할 수 있을까?

위 그림과 같이 수정이나 이벤트가 있을 경우 모두 등록된 object에게 자동적으로 수정 분을 공지하고 업데이트 하는 것이다.

Solution

Subject는 Observer의 container를 가지고 있으며, Observer를 추가하고 업데이트 하는 함수를 갖는다.

public abstract class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void attach(Observer o) {
        observers.add(o);
    }

    public void notifyObservers() {
        for(Observer o : observers) {
            o.update(this);
        }
    }
}

Observer는 생성할 때 스스로를 Subject에게 등록한다.

ublic class Observer1 extends Observer {
    private int state;
    private Subject1 subject;
    public Observer1(Subject1 subject) {
        this.subject = subject;
        subject.attach(this);
    }

    @Override
    public void update(Subject s) {
        if(this.subject == s) {
            this.state = subject.getState();
            System.out.println("Observer1: State updated to : " + this.state);
        }
    }
}

Subject를 상속받은 Subject1에서 수정이 있을 경우 notifyObserver()를 통해 update and notification을 실행한다.

public class Subject1 extends Subject {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        System.out.println(
                "Subject1 : State changed to : " + state +
                "\n Notifying observers ...");
        notifyObservers();
    }
}

 

Advantages

• observer와 subject가 분리되어 있다.

 - Subject를 오직 Observer의 state를 업데이트 할 수 있는 것만 안다.

 - Observer는 Subject에 attach할 수도 있지만 구현하기에 따라 독립적으로도 사용 할 수 있다.


Disadvantages

• update행위를 복잡하게 만든다.

 - subject의 개수와 Observer사이에 관계가 많아질 수록 복잡하게 되는데 Mediator pattern을 통해 해결 할 수 있다.

 - subject의 변화가 observer와 의존관계인 object의 연쇄 업데이트의 원인이 될 수 있다. 의도치 않은 update가 일어날 수 있다.

 

[전체코드]

https://github.com/jKyounju/adapterPatterns/tree/master/src/BehavioralPattern/Observer

https://github.com/jKyounju/adapterPatterns/blob/master/test/BehavioralPattern/ObserverPatternTest.java

728x90

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

Strategy Pattern  (0) 2022.05.22
State Pattern  (0) 2022.05.21
Memento Pattern  (0) 2022.05.21
Mediator Pattern  (0) 2022.05.15
Iterator Pattern  (0) 2022.05.15

댓글