옵저버 패턴

화낼거양's avatar
Nov 14, 2024
옵저버 패턴
Contents
예시
 
 
 
💡
  • 미리 알아두는 정보
폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식
구현이 쉽다는 장점이 있으나, 부하가 크고 주기적으로 검사하는 시간을 조율하기 어려운 단점이 있다.
 
 
옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴입니다. 주로 이벤트 핸들링 시스템이나 모델-뷰-컨트롤러(MVC) 아키텍처에서 많이 사용됩니다.
 

주요 특징:

  1. 주제(Subject)와 옵저버(Observer): 주제는 상태 변화를 관리하는 객체이고, 옵저버는 주제의 상태 변화를 감시하는 객체입니다.
  1. 알림 메커니즘: 주제 객체는 상태가 변경될 때마다 모든 옵저버에게 자동으로 알림을 보냅니다.
  1. 느슨한 결합: 주제와 옵저버는 느슨하게 결합되어 있어, 서로 독립적으로 변경이 가능합니다.

구성 요소:

  1. Subject: 주제 인터페이스로, 옵저버를 등록하고 제거하는 메서드를 정의합니다.
  1. ConcreteSubject: 주제의 구체적인 구현 클래스로, 상태를 관리하며 옵저버에게 상태 변화를 알립니다.
  1. Observer: 옵저버 인터페이스로, 주제로부터 알림을 받기 위한 메서드를 정의합니다.
  1. ConcreteObserver: 옵저버의 구체적인 구현 클래스로, 주제로부터 상태 변화를 알림받고 필요한 동작을 수행합니다.
 
 
 
 

예시

 
 
public class Pub implements PubListener { public String banana = null; // 1. 구독자 명단 List<SubListener> subList = new ArrayList<>(); // 구독자 추가 @Override public void add(SubListener sub) { subList.add(sub); } // 구독자 삭제 @Override public void remove(SubListener sub) { subList.remove(sub); } // 물건이 들어오면, 구독자들에게 알림을 보내는 메서드 @Override public void notifyChange(String msg) { // 구독자들에게 알림주기 for(SubListener sub : subList){ sub.update(msg); } } }
 
 
구체적인 설명 :
 
  1. 주제(Subject):
      • Pub 클래스는 주제 역할을 합니다. 이 클래스는 구독자(옵저버) 명단을 관리하고, 특정 이벤트(여기서는 notifyChange 메서드)를 통해 구독자들에게 알림을 보냅니다.
  1. 옵저버(Observer):
      • SubListener 인터페이스는 옵저버 역할을 하며, 이 인터페이스를 구현한 클래스들은 Pub 객체로부터 알림을 받을 수 있습니다.
  1. 구독자 명단 관리:
      • add(SubListener sub) 메서드와 remove(SubListener sub) 메서드를 통해 구독자(옵저버)를 추가하고 제거할 수 있습니다.
  1. 상태 변화 알림:
      • notifyChange(String msg) 메서드는 상태가 변경되었을 때, 구독자들에게 알림을 보내는 역할을 합니다.
 
 
 
메인 메서드 :
 
public class App { public static void main(String[] args) { PubListener pub = new Pub(); SubListener sub1 = new Sub1(); SubListener sub2 = new Sub2(); // 1. 구독하기 pub.add(sub1); pub.add(sub2); // 2. 상품이 입고되는 과정 (생략함) // 3. notifyChange 호출 if (pub.banana != null) { pub.notifyChange("상품 들어왔다"); } } }
 
Share article

moohyun