Header

[ Design Pattern ] Observer 패턴이란 (옵저버)

Observer 패턴이란 (옵저버)?

(Observer) 관찰자






이벤트가 발생하면 각 옵저버는 Notify를 받습니다.


옵저버란?


Observer란?

한마디로 주제(Subject)를 관찰하고 있는 관찰자입니다.


옵저버 패턴(observer pattern)은

객체의 상태 변화를 관찰하는 옵저버(관찰자)들의 목록을 

객체에 등록하여 상태 변화가 있을 때마다 notify를 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴입니다.




notify 함수는 관찰 대상이 발행한 메시지 이외에, 옵서버 자신이 생성한 인자값을 전달가능합니다.

각각의 파생 옵서버는 notify 함수를 구현함으로써 이벤트가 발생했을 때 처리할 각자의 동작을 개발자가 작성해야합니다.


옵서버 패턴은 (Model-View-controller, MVC) 패러다임과 자주 결합된다. 옵저버 패턴은 MVC에서 모델과 뷰 사이를 느슨히 연결하기 위해 사용된다.



실제 현실 적용

(Ex: Youtube) 

객체의 상태 변화를 관찰하는 옵저버(관찰자)들의 목록을 객체(유튜버)에 

등록하여 상태 변화가 있을 때마다 notify를 통해 객체(유튜버)가 직접 목록의 각 옵저버들에게 통지하는 방식입니다.  


발행: 유튜버       /     구독 모델(옵저버): 유튜브 구독자들



구현 예시


옵저버 패턴을 구현하는 방법에는 여러가지가 있지만, 

대체로 많이하는 방법인 주제(Subject)인터페이스와 옵저버(Observer) 인터페이스가 들어있는 클래스 디자인으로 예시를 들겠습니다. 


Subject 인터페이스와 구현체

interface Subject {
	registerObserver() // 옵저버 등록
	removeObserver() // 옵저버 삭제
	notifyObserver() // 옵저버에게 업데이트 알림
}

class SubjectImpl implements Subject {
	registerObserver() { ... }
	removeObserver() { ... }
	notifyObserver() { ... }

	getState() // 주제 객체는 상태를 설정하고 알기위한 겟터,셋터가 있을 수 있다.
	setState()
}

옵저버 인터페이스와 구현체

interface Observer{ // 옵저버가 될 객체에서는 반드시 Observer 인터페이스를 구현해야함.
	update() // 주제의 상태가 바뀌었을때 호출됨
}

class ObserverImpl implements Observer {
	update() { 
		// 주제가 업데이트 될 때 해야하는 일
	}
}


옵저버에서 update()메소드를 통해 주제의 state를 전달받긴 받고 

실제 state데이터는 주제(Subject)에 있습니다. 





마무리


1. Observer

추상화된 통보 대상


2. Youtube Subscribers(ObserverImplement)

Observer를 implements함으로써 구체적인 통보 대상이 됨


3. Subject

주제에 관심이 있는 대상 객체들을 관리


4. SubjectImplement

Subject를 extends함으로써 구체적인 통보 대상을 직접 참조하지 않아도 됨


이렇게 Observer 패턴을 이용하면 SubjectImplement클래스의 코드를 변경하지 않고도 새로운 관심 클래스 및 객체를 추가/제거하는 것이 가능합니다.





댓글 쓰기

0 댓글