JAVA/DesignPattern

Design Pattern 디자인 패턴 Observer Pattern 옵저버 패턴

호두밥 2021. 12. 28. 21:56

Observer Pattern 옵저버 패턴

행동 패턴으로, 1대다 (1 : N, one-to-many) 관계에서 사용됩니다. 객체 하나를 수정했을때, 연관된 다른 객체들에게 알림을 자동적으로 보내는 패턴입니다.  

Observer Pattern 옵저버 패턴이 적합한 경우

  • 한 객체의 변경사항이 다른 객체들에게도 전달되어야 하는 경우, 다른 객체들이 사전에 변경사항을 알아채지 못하거나, 동적으로 변경되는 경우
  • 몇 개의 오브젝트가 다른 오브젝트들에 의해 감시되어야 하는 경우

장단점

장점

  • publisher(알림을 보내는 객체) 코드를 수정하지 않고 새로운 subscriber(observer) 를 추가할 수 있습니다. (개방/폐쇄원칙)
  • 런타임에 객체의 관계를  설정할 수 있습니다.

단점

  • Observer들은 무작위 순서로 알림을 받습니다. 

 

Observer Pattern 옵저버 패턴 구현

SampleObject에 변경사항을 통지할 옵저버 리스트를 내부 변수로 선언하여 관리합니다. SampleObject에 변경이 일어났을 경우 (update 메소드가 실행된 경우) 리스트의 옵저버들에게 알림을 보냅니다. (observer들의 알림 메소드를 실행합니다.)

Observer

public abstract class Observer {
    protected SampleObject object;
    public abstract void update();
}

AbcObserver

public class AbcObserver extends Observer{

    public AbcObserver(SampleObject object) {
        this.object = object;
        this.object.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Abc Observer is notified : "+this.object.getState());
    }
}

DefObserver

public class DefObserver extends Observer{
    public DefObserver(SampleObject object) {
        this.object = object;
        this.object.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Def Observer is notified : "+this.object.getState());
    }
}

SampleObject

public class SampleObject {
    private List<Observer> observers = new ArrayList<>();
    public String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }

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

    public void notifyObservers(){
        observers.stream().forEach(Observer::update);
    }
}

Main

public class Main {
    public static void main(String[] args) {
        SampleObject object = new SampleObject();
        new AbcObserver(object);
        new DefObserver(object);
        object.setState("doing start");
    }
}
Abc Observer is notified : doing start
Def Observer is notified : doing start

참조