observer 란 뜻 그대로 관찰자 라는 의미이다. 관찰 하는 대상의 상태가 변화되었을때 관찰자에게 상태변화를 알리는 패턴으로 상태변화에 따른 처리를할때 사용하면 좋다.
순수 java 코드로 실습해보겠습니다. 아래는 예시 class 들입니다.
Observer
public interface Observer {
public abstract void update(NumberGenerator generator);
}
옵저버 클래스입니다. update 메서드를 통해 NumberGenerator 를 관찰하여 상태변화를 알립니다.
NumberGenerator
import java.util.ArrayList;
import java.util.List;
public abstract class NumberGenerator {
// Observer 를 저장
private List<Observer> observers = new ArrayList<>();
// Observer 를 추가
public void addObserver(Observer observer) {
observers.add(observer);
}
//Observer 를 제거
public void deleteObserver(Observer observer) {
observers.remove(observer);
}
// Observer 에 통지
public void notifyObserver() {
for (Observer o :
observers) {
o.update(this);
}
}
// 수 취득
public abstract int getNumber();
// 수 생성
public abstract void execute();
}
observer 를 추가,제거 하고 observer에 있는 update를 통해 알리는 기능 과 수를 생성, get 해오는 메서드들이 들어있는 추상 클래스 입니다.
GraphObserver
public class GraphObserver implements Observer{
@Override
public void update(NumberGenerator generator) {
System.out.println("GraphObserver");
int count = generator.getNumber();
for (int i = 0; i < count; i++) {
System.out.print("*");
}
System.out.println("");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
수가 생성될때 관찰하여 *모양의 간이그래프로 표시하는 클래스 입니다.
DigitObserver
public class DigitObserver implements Observer {
@Override
public void update(NumberGenerator generator) {
System.out.println("DigitObserver :" + generator.getNumber());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
수가 생성될때 관찰하여 숫자로 나타내는 클래스입니다.
RandomNumberGenerator
import java.util.Random;
public class RandomNumberGenerator extends NumberGenerator {
private Random random = new Random();
private int num;
@Override
public int getNumber() {
return num;
}
@Override
public void execute() {
for (int i = 0; i < 20; i++) {
num = random.nextInt(50);
notifyObserver();
}
}
}
랜덤으로 수를 생성하고 생성된 수를 return하는 클래스 입니다.
Main
public class Main {
public static void main(String[] args) {
NumberGenerator numberGenerator = new RandomNumberGenerator();
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphObserver();
numberGenerator.addObserver(observer1);
numberGenerator.addObserver(observer2);
numberGenerator.execute();
}
}
Main 클래스 입니다. 실행하면 아래와 같은 출력결과를 얻을 수 있습니다.
호출순서
Observer 패턴에서 유의할점은 remove를 하지않으면 사용하지 않더라도 가비지 컬렉터에서 객체를 없애지 않으므로 꼭 remove 해줄것.