옵저버 패턴

이종찬·2023년 2월 7일
0
post-custom-banner

📖 옵저버 패턴?

옵저버 패턴은 객체의 상태 변화를 관찰하는 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 옵저버에게 통지하도록 하는 디자인 패턴입니다.변화가 일어났을 때, 미리 등록된 다른 클래스에 통보해주는 패턴. 주로 event listener에 사용되고 있습니다. -> 이벤트가 일어나는 것을 감시

🤔 사용해야 하는 이유는?

안드로이드의 경우 유저가 어떠한 이벤트를 사용할지 모릅니다. UI의 어떤 버튼을 누를지, 키보드로 입력하는지 등등. 이러한 시스템에 의해 발생하는 동작들을 미리 정의해둔 동작을 즉각수행하게 해줍니다. 옵저버 패턴을 활용하면 다른 객체의 상태 변화를 별도의 함수 호출 없이 즉각수행하며 이벤트에 대한 처리가 많은 프로그램이라면 효율적인 코드 작성이 가능합니다.

또한 대상과 옵저버가 밀접하게 연결되어 있지 않고 서로에 대해 알 필요가 없기 때문에 느슨한 연결이 가능합니다. 이로써 대상이나 다른 옵저버에게 영향을 주지 않고 필요에 따라 옵저버를 쉽게 추가 및 제거가 가능합니다.

😮 사용되는 사례

시스템에 의해 발생하는 동작들이 예시로 들 수 있습니다. 위의 예시에서 나온 안드로이드에 버튼 클릭 리스너, 호출한 API가 수신되었을 경우 등이 있습니다.

❌ 문제가 되는 경우

  • 복잡성 : 옵저버와 주체가 많으면 복잡하고 유지하기 어려운 코드가 될 수 있습니다.
  • 긴밀한 결합 : 잘못하면 옵저버간 긴밀한 결합이 되어 구성요소의 추가가 어렵니다.
  • 옵저버와 객체와의 단절 : 옵저버가 등록 취소되면 예측할 수 없는 동작을 초래 합니다.
  • 중복 : 동일한 업데이트에 대해 여러 알림을 받을 수 있으므로 중복성, 비효율성을 야기할 수 있습니다. -> 성능 오버헤드로 이어집니다.

👨‍💻 구현

interface

public interface IButtonListener {
    void clickEvent(String event);
}

구현

class Button {
    private String name;
    private IButtonListener listener;

    public Button(String name) {
        this.name = name;
    }

    public void click(String msg) {
        listener.clickEvent(msg);
    }

    public void addListener(IButtonListener listener) {
        this.listener = listener;
    }
}
public class Main {
    public static void main(String[] args) {
        Button button = new Button("button");

        button.addListener(new IButtonListener() {
            @Override
            public void clickEvent(String event) {
                System.out.println(event);
            }
        });

        button.click("click 1");
        button.click("click 2");
        button.click("click 3");
        button.click("click 4");

    }

}

message 1
message 2
message 3
message 4

✅ 요약

  • 옵저버 패턴은 개체가 다른 개체의 변경 사항을 관찰하고 알림을 받을 수 있도록 하는 디자인 패턴입니다.
  • 옵저버 패턴을 활용하면 느슨한결합을 촉진하고 동일한 옵저버가 여러 대상을 관찰하는데 사용되어 유연성과 재사용성을 허용합니다.
  • 주체가 많은 경우 복잡성이 증가하여 유지하기 어렵고 성능 오버헤드를 유발할 수 있습니다.
profile
왜? 라는 질문이 사라질 때까지
post-custom-banner

0개의 댓글