[디자인패턴] Observer (행동패턴)

유존돌돌이·2022년 2월 28일
0

공부

목록 보기
14/22

옵저버 패턴(observer pattern)은 객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 주로 분산 이벤트 핸들링 시스템을 구현하는 데 사용된다. 발행/구독 모델로 알려져 있기도 하다.

아래 예는 스타크래프트의 3종족을 모두 관리하는 플레이어(Supervisor)가 일꾼들을 부대지정하여 공통 JOB을 할당했을때의 예이다.

플레이어의 Order Interface

public interface Orders {
	public void getResource(String resource);
	public void build(String product);
}

플레이어의 Class

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);
		}
	}
}

일꾼들의 JOB Interface

public interface DoJob {
	public void notify(String msg);
}

일꾼들 Class

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을 분산하여 시키거나 공동으로 진행했을때 유용한 패턴이다.

0개의 댓글