옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다.
아래 예는 스타크래프트의 3종족을 모두 관리하는 플레이어(Supervisor)가 일꾼들을 부대지정하여 공통 JOB을 할당했을때의 예이다.
public interface Orders {
public void getResource(String resource);
public void build(String product);
}
public class Supervisor implements Orders{
private String name;
private List<Worker> list = new ArrayList<>();
public Supervisor(String name) {
this.name = name;
}
// 일꾼들 등록
public void add(Worker worker) {
list.add(worker);
}
@Override
public void build(String building) {
notify(building+"을 건설하시오");
}
@Override
public void getResource(String resource) {
notify(resource+" 캐라");
}
public void notify(String msg) {
System.out.println("[관리자 "+name+"의 지시] : "+msg);
for(Worker worker : list) {
worker.notify(msg);
}
}
}
public interface DoJob {
public void notify(String msg);
}
public class Worker implements DoJob{
private String name;
public Worker(String name) {
this.name = name;
}
@Override
public void notify(String msg) {
System.out.println(name+" : "+msg);
}
}
public class MyProgram {
public static void main(String[] args) {
Supervisor me = new Supervisor("나관리");
Worker SCV = new Worker("SCV");
Worker Probe = new Worker("Probe");
Worker Drone = new Worker("Drone");
me.add(SCV);
me.add(Probe);
me.add(Drone);
me.getResource("GAS");
me.getResource("Mineral");
me.build("막사");
}
}
[관리자 나관리의 지시] : GAS 캐라
SCV : GAS 캐라
Probe : GAS 캐라
Drone : GAS 캐라
[관리자 나관리의 지시] : Mineral 캐라
SCV : Mineral 캐라
Probe : Mineral 캐라
Drone : Mineral 캐라
[관리자 나관리의 지시] : 막사을 건설하시오
SCV : 막사을 건설하시오
Probe : 막사을 건설하시오
Drone : 막사을 건설하시오
어떠한 상태변화가 있을때, 그 하위 객체들에게 job을 분산하여 시키거나 공동으로 진행했을때 유용한 패턴이다.