객체의 변화를 감지한 후 필요한 액션을 취하는 패턴
1. 코드
Observer : NumberGenerator을 관찰하는 관찰자 인터페이스
public interface Observer {
public void update(NumberGenerator numberGenerator);
}
NumberObserver : observer1 (변경된 숫자 표시)
public class NumberObserver implements Observer {
@Override
public void update(NumberGenerator numberGenerator) {
System.out.println("new num : " + numberGenerator.getNum());
}
}
BarObserver : observer2 (변경된 숫자를 바 형태로 표시)
public class BarObserver implements Observer {
@Override
public void update(NumberGenerator numberGenerator) {
int num = numberGenerator.getNum();
System.out.print("new bar : ");
for (int i = 0; i < num; i++) {
System.out.print("|");
}
System.out.println("");
}
}
NumberGenerator : observer에게 관찰을 받는 객체
public abstract class NumberGenerator {
private List<Observer> observerList;
protected int num;
public void addObserver(Observer observer) {
if (observerList == null) {
observerList = new ArrayList<>();
}
observerList.add(observer);
}
public int getNum() {
return num;
}
public void notifyObserver() {
for (Observer observer : observerList) {
observer.update(this);
}
}
public abstract void execute();
}
RandomNumberGeneraotor : 숫자가 랜덤하게 바뀌는 관찰 대상자
public class RandomNumberGenerator extends NumberGenerator {
private Random random = new Random();
private int lastNum;
public RandomNumberGernerator(int lastNum) {
super();
this.lastNum = lastNum;
}
@Override
public void execute() {
this.num = random.nextInt(lastNum + 1);
notifyObserver();
}
}
Main : 테스트 클래스
public class Main {
public static void main(String[] args) {
NumberGenerator numberGenerator = new RandomNumberGernerator(50);
numberGenerator.addObserver(new NumberObserver());
numberGenerator.addObserver(new BarObserver());
for (int i = 0; i < 10; i++) {
numberGenerator.execute();
}
}
}
2. 특징
- 사실상 관찰을 하는게 아니라 변경을 보고 받는 형태
- observer에서 관찰 대상자를 호출 하는 경우가 생기면, '관찰 대상자 -> observer -> 관찰 대상자...' 이렇게 무한반복이 일어날수 있으므로 주의가 필요하다.
- mvc 패턴에서 model과 view도 위의 관계에 있음. (model의 변화에 따라 view가 달라짐)
3. 해당 패턴을 고려해볼만한 상황
- 변화가 수시로 일어나고 그 변화에 따라 적절한 행동이 필요한 경우
'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글
State 패턴 (0) | 2021.03.14 |
---|---|
Memento 패턴 (0) | 2021.03.08 |
Mediator 패턴 (0) | 2021.02.14 |
Facade 패턴 (0) | 2021.02.12 |
Chain Of Responsibility 패턴 (0) | 2021.02.11 |