hong's android

[디자인 패턴] 옵저버 패턴 본문

Design-Pattern

[디자인 패턴] 옵저버 패턴

_hong 2023. 2. 28. 17:21

옵저버 패턴이란?

한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다. 주제 - 옵저버로 일대다 관계가 이루어지고 주제의 상태가 바뀌면 옵저버들에게 연락이 간다.

 

왜 옵저버 패턴을 사용할까?

만약 데이터의 변경사항에 따라 다른 객체에게 알려야하는 로직을 구성할때 아래와 같이 구성된다.

 

observer1.notify(int data1,int data2,int data3);
observer2.notify(int data1,int data2,int data3);
observer3.notify(int data1,int data2,int data3);

 

subject 클래스 안에 위 로직으로 구성 할 수 있다. 

위 로직은 subject - observer 서로의 정보를 알아야하고 호출이 구체화되어있어 변화에 취약하다.  

그리고 실행 중에 옵저버를 제거하거나 더할 수 없다.

옵저버 패턴을 사용하면 느슨한 subject - observer 간 느슨한 결합이 형성되면서 변화에 좀 더 유연해진다. 옵저버,주제 클래스 로직을 구성하지 않아도 데이터를 구독하는 형태를 만들 수 있다.

 

interface Subject {

    fun registerObserver(o : Observer)

    fun removeObserver(o : Observer)

    fun notifyObservers()

}

 

Observer를 관리 / 알림을 보내는 역할

 

 interface Observer {
    fun update(s : String)
}

 

다수의 Observer들은 일괄적인 update()메소드를 구현해서 다른 Observer가 추가되어도 update()메소드만 호출하면된다.

 

 

class ConcreteSubject : Subject {

    var observers : MutableList<Observer>
    var word : String

    constructor(w : String){
        observers = mutableListOf()
        word = w
    }

    override fun registerObserver(o: Observer) {
        observers.add(o)
    }

    override fun removeObserver(o: Observer) {
        observers.remove(o)
    }

    override fun notifyObservers() {
        for(o : Observer in observers){
            o.update(word)
        }
    }

    fun setData(s:String){
        word = s
        notifyObservers()
    }

}

 

ConcreteSubject 주제 클래스는 Subject를 구현하게 된다.

Observer를 등록/제거를 하거나 데이터가 변경될때 알림을 보낸다.

 

 

* 디자인 패턴 구현 깃허브

https://github.com/f-lab-edu/DesignPatternStudy/tree/main/app/src/main/java/com/example/designpatternstudy