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

송송승현's avatar
Nov 14, 2024
[디자인패턴]7.옵저버패턴

정의

💡
객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때 마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
주제와 옵저버 간의 일대다 관게를 형성, 주제의 상태 변화가 있을 때 모든 옵저버에게 자동으로 알림을 보내고 업데이트를 수행

옵저버 패턴 예제

public interface PubListener { void add(SubListener sub); void remove(SubListener sub); void notifyChange(String msg); } public class Pub implements PubListener{ 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(int i=1; i<6; i++){ try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("."); } for(SubListener sub : subList){ sub.update(msg); } } } public interface SubListener { void update(String msg); } public class Sub1 implements SubListener{ @Override public void update(String msg) { System.out.println("Sub1이 받은 알림 : " + msg); // 무엇을 해야할지?! } } // 옵저버 패턴 -> 콜백 public class App { public static void main(String[] args) { // 1. 객체 생성 PubListener pub = new Pub(); SubListener sub1 = new Sub1(); SubListener sub2 = new Sub2(); // 2. 구독하기 pub.add(sub1); pub.add(sub2); //3. 상품 들어옴(가정) //4. notifyChange 호출 pub.notifyChange("상품 입고"); } }

구성

  • 주제(Subject): 상태를 관리하고, 옵저버 목록을 유지하며, 상태가 변경되면 옵저버들에게 알림
  • 옵저버(Observer): 주제의 상태 변화를 감지하고, 그에 따른 행동을 수행
  • 구체적인 주제(Concrete Subject): 주제의 구체적인 구현 클래스. 상태를 변경하고, 상태 변경 시 옵저버에게 알림
  • 구체적인 옵저버(Concrete Observer): 옵저버의 구체적인 구현 클래스. 주제의 상태 변화를 감지하고, 그에 따라 필요한 행동 수행

장점

  • 느슨한 결합: 주제와 옵저버 간의 결합도를 낮춤
  • 유연성: 새로운 옵저버를 쉽게 추가
  • 재사용성: 주제와 옵저버를 독립적으로 재사용

단점

  • 복잡성 증가: 옵저버가 많아질수록 관리가 어려워짐
  • 실시간성 보장 어려움: 모든 옵저버가 실시간으로 업데이트를 받을 수 있도록 보장 힘듬

풀링(Polling)

💡
컴퓨터 과학에서 장치나 프로그램이 다른 장치나 프로그램의 상태를 주기적으로 검사하여 조건을 만족할 때 자료 처리를 하는 방식

푸시(Push)

💡
서버가 데이터 변경 시 클라이언트에 직접 알림을 보내는 방식.
 
Share article

송승현의 블로그