-
행동(Behavioral) - 관찰자(Observer) 패턴Java/디자인패턴 2024. 11. 14. 09:24반응형
관찰자(Observer) 패턴은 행동(Behavioral) 디자인 패턴에 속합니다. 이 패턴은 객체 간의 일대다(one-to-many) 의존 관계를 정의하여, 한 객체의 상태 변화가 있을 때 이를 의존하고 있는 다른 객체들이 자동으로 통보 받고 업데이트되도록 설계합니다. 일반적으로, 이러한 관계는 "발행-구독(Publish-Subscribe)" 메커니즘을 사용하여 구현됩니다.
Observer 패턴 개념 설명
- 주체(Subject): 상태를 갖고 있으며, 상태가 변경되면 관찰자들에게 알리는 객체입니다.
- 관찰자(Observer): 주체의 상태 변화에 반응하는 객체입니다. 주체에 등록된 여러 관찰자들은 주체가 변경될 때마다 업데이트를 받습니다.
- 활용 예:
- GUI 이벤트 시스템: 버튼 클릭이나 스크롤 동작 등 UI 상의 이벤트를 여러 UI 요소들이 관찰하고 업데이트하는 경우.
- 알림 시스템: 뉴스 서비스, 소셜 미디어 알림 등에서 특정 상태 변경을 다수의 사용자에게 알릴 때.
- 모니터링 시스템: 데이터나 시스템 상태가 변화할 때 자동으로 이를 감지하고 기록하거나 대응하는 경우.
Java로 Observer 패턴 예시
Observer 패턴을 Java로 구현하기 위해, Subject 인터페이스와 Observer 인터페이스를 정의하고, 이를 구현하는 클래스를 작성해보겠습니다.
1. Subject 인터페이스
import java.util.ArrayList; import java.util.List; interface Subject { void addObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); }
2. Observer 인터페이스
interface Observer { void update(String message); }
3. ConcreteSubject 클래스 (주체 구현)
class NewsAgency implements Subject { private List<Observer> observers = new ArrayList<>(); private String news; public void setNews(String news) { this.news = news; notifyObservers(); } @Override public void addObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(news); } } }
4. ConcreteObserver 클래스 (관찰자 구현)
class NewsSubscriber implements Observer { private String name; public NewsSubscriber(String name) { this.name = name; } @Override public void update(String message) { System.out.println(name + " received news update: " + message); } }
5. Main 클래스 (실행 예시)
public class ObserverPatternDemo { public static void main(String[] args) { // 주체(Subject) 생성 NewsAgency agency = new NewsAgency(); // 관찰자(Observer) 생성 NewsSubscriber subscriber1 = new NewsSubscriber("Alice"); NewsSubscriber subscriber2 = new NewsSubscriber("Bob"); // 관찰자 등록 agency.addObserver(subscriber1); agency.addObserver(subscriber2); // 상태 변경 및 알림 전송 agency.setNews("Breaking News: Observer Pattern Implemented in Java!"); // 관찰자 제거 후 상태 변경 agency.removeObserver(subscriber1); agency.setNews("Another Update: Subscriber Unsubscribed!"); } }
결과 출력
Alice received news update: Breaking News: Observer Pattern Implemented in Java! Bob received news update: Breaking News: Observer Pattern Implemented in Java! Bob received news update: Another Update: Subscriber Unsubscribed!
코드 설명
- Subject 인터페이스는 관찰자를 등록하고 제거하며, 상태 변경 시 관찰자들에게 알리는 기능을 정의합니다.
- Observer 인터페이스는 주체로부터 알림을 받을 때 수행할 동작을 정의합니다.
- NewsAgency 클래스는 Subject를 구현하며, 관찰자들에게 뉴스 업데이트를 전달합니다.
- NewsSubscriber 클래스는 Observer를 구현하여 뉴스 업데이트를 받을 때마다 해당 정보를 출력합니다.
- ObserverPatternDemo 클래스는 실제로 Observer 패턴을 사용하는 예시로, 주체와 관찰자를 생성하고 등록/삭제 후 상태 변화를 확인합니다.
이 Observer 패턴을 통해 객체 간의 결합도를 낮추면서 이벤트 기반으로 여러 객체에 상태 변화를 자동으로 알릴 수 있습니다. 이로 인해 확장성과 유지보수성이 개선됩니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
생성(Creational) - 추상 팩토리(Abstract Factory) 패턴 (0) 2024.11.16 구조적(Structural) - 플라이웨이트(Flyweight) 패턴 (1) 2024.11.15 구조패턴 - 프록시(Proxy) 패턴 (0) 2024.11.13 생성패턴 - 팩토리 메소드(Factory Method) 패턴 (0) 2024.11.12 구조 패턴- 브릿지(Bridge) 패턴 (0) 2024.11.11