본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Observer 패턴

객체의 변화를 감지한 후 필요한 액션을 취하는 패턴


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