옵서버 Observer
🙊

옵서버 Observer

Created
Apr 25, 2024 03:48 AM
Last edited time
Last updated April 25, 2024
Tags
CS
Language
URL

Intro::

디자인 패턴 중 행위 패턴인 옵서버에 대해 알아봅시다.
 

옵서버 패턴이란?

💡
옵서버(Observer) 패턴은 소프트웨어 디자인 패턴 중 하나로, 객체들 사이의 일대다 의존 관계를 구성하여 한 객체의 상태가 변경될 때 그 객체에 의존하는 모든 객체들에게 자동으로 알림이 가도록 만드는 패턴입니다. 이 패턴은 주로 이벤트 리스닝, 상태 감시 등에 사용됩니다.
 

장점

  1. 분리와 확장성: 옵서버 패턴은 주체(subject)와 옵서버(observer)가 느슨하게 결합되어 있기 때문에, 서로 독립적으로 확장하거나 변경할 수 있습니다. 이는 유지보수와 확장에 용이합니다.
  1. 재사용성: 주체는 그 상태를 여러 옵서버에게 공유할 수 있으므로 코드의 재사용성이 향상됩니다.
  1. 동적 구독 관리: 실행 시간(runtime)에 옵서버를 추가하거나 제거할 수 있습니다.
 

단점

  1. 메모리 누수: 옵서버가 제대로 해제되지 않고 계속해서 주체에 등록된 채로 남아 있으면 메모리 누수가 발생할 수 있습니다.
  1. 성능 문제: 많은 수의 옵서버가 업데이트를 받을 때 성능 저하가 발생할 수 있습니다.
  1. 비동기 처리 문제: 옵서버들이 비동기적으로 업데이트를 처리할 때 순서와 일관성을 보장하기 어려울 수 있습니다.
 

코드 예시

import java.util.ArrayList; import java.util.List; // 옵서버 인터페이스 interface Observer { void update(float temperature); } // 주체 인터페이스 interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void notifyObservers(); } // 기상 스테이션 class WeatherStation implements Subject { private List<Observer> observers; private float temperature; public WeatherStation() { observers = new ArrayList<>(); } @Override public void registerObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { observers.remove(o); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(temperature); } } public void setTemperature(float temperature) { this.temperature = temperature; notifyObservers(); } } // 휴대폰 디스플레이 class PhoneDisplay implements Observer { private Subject weatherStation; public PhoneDisplay(Subject weatherStation) { this.weatherStation = weatherStation; weatherStation.registerObserver(this); } @Override public void update(float temperature) { System.out.println("Phone Display: " + temperature + "도"); } } // 창문 디스플레이 class WindowDisplay implements Observer { private Subject weatherStation; public WindowDisplay(Subject weatherStation) { this.weatherStation = weatherStation; weatherStation.registerObserver(this); } @Override public void update(float temperature) { System.out.println("Window Display: " + temperature + "도"); } } // 실행 클래스 public class Main { public static void main(String[] args) { WeatherStation station = new WeatherStation(); PhoneDisplay phoneDisplay = new PhoneDisplay(station); WindowDisplay windowDisplay = new WindowDisplay(station); station.setTemperature(23.5f); } }
 

References::

Loading Comments...