Observer?
- 옵저버 패턴 : 객체 상태의 변화를 관찰하는 관찰자들, 옵저버들의 목록을 객체에 등록하는 디자인 패턴
- 흔히 우리가 아는 Publisher/Subscriber 패턴과 유사하다!
- 특정한 Node(Subject)가 다른 Node(Observer)들을 관찰하면서, 알림을 주는 방식이다!
* 주로 이벤트 핸들링 시스템을 구현할 때 사용되는 디자인 패턴이다!
Why Observer?
- 분산 환경에서 각각의 Node에 대한 상태 변화에 빠르게 반응해야 될 때가 있다. 이러한 상황일 때, Observer 패턴을 활용하면 쉽게 변화에 반응할 수 있다!
- ROS의 Node 통신 방식도 Observer 패턴구조를 주로 활용하고 있다!! ( 심지어 엄청 유기적으로 통신가능! )
Observer Pattern 방식
* Subject(주체) 객체는 Observer들의 List를 가지고 추가/삭제/알림이 가능하다!
* Observer(관찰) 객체는 반드시 update() 메서드를 구현해야 한다!
* 상태 변화시 Subject(주체) 객체는 Observer들의 update() 메서드를 실행한다!!
자세한건 코드를 통해 살펴보자!
package observer;
public interface Observer {
void update();
}
1. Observer의 인터페이스
package observer;
public interface Observable {
void doSubscribe(Observer observer);
void exitSubscribe(Observer observer);
void alarmToAllObservers();
}
2. Subject의 인터페이스
package observer;
import java.util.ArrayList;
import java.util.List;
public class Subscriber implements Observable {
private final List<Observer> observers = new ArrayList<>();
private boolean newContent;
public void makeNewContents() {
newContent = true;
}
public boolean isNewContent() {
return newContent;
}
@Override
public void doSubscribe(final Observer observer) {
observers.add(observer);
}
@Override
public void exitSubscribe(final Observer observer) {
observers.remove(observer);
}
@Override
public void alarmToAllObservers() {
observers.forEach(Observer::update);
}
}
3. Subject의 실체 구현체
- doSubscribe는 구독자를 추가하는 메서드
- exitSubscribe는 구독자를 삭제하는 메서드
- alarmToAllObserveres는 구독자들에게 update하는 메서드
package observer;
public class Lion implements Observer {
@Override
public void update() {
System.out.println("라이언: 콘텐츠 업데이트 받았어!");
}
}
package observer;
public class Muzi implements Observer {
@Override
public void update() {
System.out.println("무지: 콘텐츠 업데이트 받았어!");
}
}
4. Observer의 실제 구현체
* Observable이 발행자(Publisher) 역할을 맡게 되고, Observer가 구독자(Subscriber) 역할을 맡게 되는 구조다!
테스트 결과
package observer;
import org.junit.jupiter.api.Test;
public class ObserverTest {
@Test
void Observer가_제대로_작동하는지_확인() {
/* Given */
Subscriber subscriber = new Subscriber();
Observer lion = new Lion();
Observer muzi = new Muzi();
/* When */
subscriber.doSubscribe(lion);
subscriber.doSubscribe(muzi);
subscriber.makeNewContents();
subscriber.alarmToAllObservers();
subscriber.exitSubscribe(muzi);
subscriber.alarmToAllObservers();
}
}
위와 같은 테스트 코드를 돌리면!!
1. lion과 Muzi가 구독자목록에 추가된다!
2. alarm이 전부 가게 되므로, Muzi와 Lion은 수신알람을 띄우게 된다!
3. Muzi를 구독자 목록에 삭제한다!
4. alarm은 Lion한테만 가게되므로 Lion 수신알람만 받게 된다!
'Developer > Design Pattern' 카테고리의 다른 글
Abstract Factory Pattern - 추상팩토리 패턴 (0) | 2019.06.18 |
---|---|
Template Method Pattern - 템플릿 메소드 패턴 (0) | 2019.06.09 |
Visitor Pattern - 비지터 패턴, 방문자 패턴 (2) | 2019.05.26 |
Strategy Pattern - 스트레지 패턴, 전략 (0) | 2019.05.26 |
Singleton Pattern - 싱글톤 패턴 (6) | 2019.05.24 |