(디자인 패턴) 옵저버 패턴이란 (Observer Pattern)

제로코딩

·

2022. 6. 23. 18:17

반응형

옵저버 패턴이란 (Observer Pattern)

옵저버 패턴 (Observer) 관찰자

이벤트가 발생하면 각 옵저버는 콜백을 받습니다.

 

 

 

⚡️ 옵저버란

 

옵저버 패턴(observer pattern)은

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

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

 

주로 분산 이벤트 핸들링 시스템을 구현.

 

발행/구독 모델로 알려져 있기도 하다. 

 

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

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

 

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

대표적으로 모델에서 일어나는 이벤트를 통보받는 옵저버는 뷰의 내용을 바꾸는 스위치를 작동시킨다.

 

 

 

 

 

 

📌 실제 적용 사례

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

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

 

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

 

 

 

 

 

 

📌 구현 예시

옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고, 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성입니다.

 

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

대체로 많이하는 방법인 주제(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)에 있습니다. 

 

옵저버는 데이터가 변경되었을 때 주제에서 데이터를 전달해주기를 기다리는 입장이기 때문에 의존성을 가집니다. 이런 방법을 사용하면 여러 객체에서 동일한 데이터를 제어하도록 하는 것에 비해 더 깔끔한 객체지향 디자인이 가능합니다.

 

 

📌 마무리

 

마무리하자면, 즉, 어떤 객체(발행:유튜버)의 상태가 변할 때 그와 연관된 객체들(옵저버: 구독자들)에게 알림을 보내는 디자인 패턴이 옵저버 패턴입니다.

 

 

 

반응형