옵저버란 관찰자를 뜻하며 사용자가 어떠한 행위를 하게 되면 등록된 옵저버들을 실행하게 되는 방식이다
private static void observer() {
RandomGenerator randomGenerator = new RandomGenerator();
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphicObserver();
Observer observer3 = number -> {
for (int i = 0; i < number; i++) {
System.out.print("=");
}
System.out.println();
};
randomGenerator.addObserver(observer1);
randomGenerator.addObserver(observer2);
randomGenerator.addObserver(observer3);
randomGenerator.execute();
}
// 출력
숫자 : 21
*********************
=====================
옵저버 객체 randomGenerator에 Digit옵저버, Graphic옵저버와 메인에서 람라식으로 선언한 옵저버를 넣고 메서드를 실행하는 모습이다
Observer 인터페이스
public interface Observer {
void update(int number);
}
Observer를 관리하는 RandomGenerator 클래스
public class RandomGenerator {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 리스트에 담겨있는 옵저버들 각각에 랜덤으로 생성된 수를 넘겨주고 해당
// 옵저버의 update메서드를 실행시킨다
public void execute() {
int num = new Random().nextInt(45);
observers.forEach(ob -> ob.update(num));
}
}
DigitObserver 객체
public class DigitObserver implements Observer{
@Override
public void update(int number) {
System.out.println("숫자 : " + number);
}
}
GraphicObserber 객체
public class GraphicObserver implements Observer{
@Override
public void update(int number) {
for (int i = 0; i < number; i++) {
System.out.print("*");
}
System.out.println();
}
}
인터페이스를 사용하여 관찰자 객체에는 update메서드가 있는것이 보장되어있다. 따라서 관찰 대상은 이런 특징만 알면 자신의 상태를 통지하고 싶을때 해당객체의 update메서드만 호출하면 된다
다양한 형태의 옵저버를 만들어서 원하는 기능에 복수의 옵저버를 넣어놓고 어떠한 이벤트가 이뤄지면 해당 옵저버를 담고있는 객체가 실행되도록 할수 있다
인터페이스와 추상클래스를 사용하므로 관찰자가 (즉 옵저버가 무슨 객체인지) 몰라도 된다, RandomGenerator 클래스에는 옵저버 관련 의존성이 발생하지 않는다. 단지 주어진 옵저버들을 받고 실행 시키는 메서드만 존재할 뿐이다
수정사항이 필요할 경우 해당 추상클래스만 수정하면 된다