Intro::
디자인 패턴 중 행위 패턴인 옵서버에 대해 알아봅시다.
옵서버 패턴이란?
옵서버(Observer) 패턴은 소프트웨어 디자인 패턴 중 하나로, 객체들 사이의 일대다 의존 관계를 구성하여 한 객체의 상태가 변경될 때 그 객체에 의존하는 모든 객체들에게 자동으로 알림이 가도록 만드는 패턴입니다. 이 패턴은 주로 이벤트 리스닝, 상태 감시 등에 사용됩니다.
장점
1.
분리와 확장성: 옵서버 패턴은 주체(subject)와 옵서버(observer)가 느슨하게 결합되어 있기 때문에, 서로 독립적으로 확장하거나 변경할 수 있습니다. 이는 유지보수와 확장에 용이합니다.
2.
재사용성: 주체는 그 상태를 여러 옵서버에게 공유할 수 있으므로 코드의 재사용성이 향상됩니다.
3.
동적 구독 관리: 실행 시간(runtime)에 옵서버를 추가하거나 제거할 수 있습니다.
단점
1.
메모리 누수: 옵서버가 제대로 해제되지 않고 계속해서 주체에 등록된 채로 남아 있으면 메모리 누수가 발생할 수 있습니다.
2.
성능 문제: 많은 수의 옵서버가 업데이트를 받을 때 성능 저하가 발생할 수 있습니다.
3.
비동기 처리 문제: 옵서버들이 비동기적으로 업데이트를 처리할 때 순서와 일관성을 보장하기 어려울 수 있습니다.
코드 예시
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);
}
}
Java
복사