Contents
예시- 미리 알아두는 정보
폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식
구현이 쉽다는 장점이 있으나, 부하가 크고 주기적으로 검사하는 시간을 조율하기 어려운 단점이 있다.
옵서버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴입니다.
주로 이벤트 핸들링 시스템이나 모델-뷰-컨트롤러(MVC) 아키텍처에서 많이 사용됩니다.
주요 특징:
- 주제(Subject)와 옵저버(Observer): 주제는 상태 변화를 관리하는 객체이고, 옵저버는 주제의 상태 변화를 감시하는 객체입니다.
- 알림 메커니즘: 주제 객체는 상태가 변경될 때마다 모든 옵저버에게 자동으로 알림을 보냅니다.
- 느슨한 결합: 주제와 옵저버는 느슨하게 결합되어 있어, 서로 독립적으로 변경이 가능합니다.
구성 요소:
- Subject: 주제 인터페이스로, 옵저버를 등록하고 제거하는 메서드를 정의합니다.
- ConcreteSubject: 주제의 구체적인 구현 클래스로, 상태를 관리하며 옵저버에게 상태 변화를 알립니다.
- Observer: 옵저버 인터페이스로, 주제로부터 알림을 받기 위한 메서드를 정의합니다.
- 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);
}
}
}
구체적인 설명 :
- 주제(Subject):
Pub
클래스는 주제 역할을 합니다. 이 클래스는 구독자(옵저버) 명단을 관리하고, 특정 이벤트(여기서는notifyChange
메서드)를 통해 구독자들에게 알림을 보냅니다.
- 옵저버(Observer):
SubListener
인터페이스는 옵저버 역할을 하며, 이 인터페이스를 구현한 클래스들은Pub
객체로부터 알림을 받을 수 있습니다.
- 구독자 명단 관리:
add(SubListener sub)
메서드와remove(SubListener sub)
메서드를 통해 구독자(옵저버)를 추가하고 제거할 수 있습니다.
- 상태 변화 알림:
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