DevBoi

[Java] 옵저버 패턴 본문

Language/[Java]

[Java] 옵저버 패턴

HiSmith 2022. 3. 30. 14:50
반응형

옵저버 패턴은 간단하게 얘기하면, 어떤 객체의 상태가 변할 때 그와 연관된 객체 들에게 알림을 보내는 디자인 패턴이다.

 

 

쉽게 얘기하면, Badi의 상태가 변할때 마다 notifyCrew를 호출,

해당 크루는 객체에서 가지고 있는 Crew원의 리스트를 업데이트 해준다.

 

메인에서는 배디를 크루원들이 구독하여, 구독자와 발행자의 관게를 맺게 된다.

 

주로 분산/이벤트 핸들링 시스템을 구현하는 데 사용된다.

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

발행자의 상태가 변경되면 구독자들에게 해당 값을 전파하는 방식이다.

 

 

 

옵저버 패턴은 한 객체의 상태가 바뀌면, 그 객체에 의존하는 다른 객체들한테 연락이 가고

자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의한다.

 

단, 설계는 느슨한 결합으로 하는 것이 좋다.

 

두 객체가 느슨하게 결합되어 있다는 것은, 둘이 상호작용을 하긴 하지만,

서로에 대해 잘 모르는 것을 의미한다. 해당 설계에 대한 장점은 아래와 같다.

 

-옵저버를 언제든 새로 추가,제거할 수 있다.

-새로운 형식의 옵저버라 할 지라도 주제를 전혀 변경할 필요가 없다.

-주제와 옵저버는 서로 독립적으로 재사용 할 수 있다.

-주제나 옵저버가 바뀌더라도 서로에게 영향을 미치지 않는다.

 

 

장점 

실시간으로 한 객체의 변경사항을 다른 객체에 전파 할 수있다.

느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다.

 

단점

너무많이 사용하면 상태관리가 어렵다.

Thread safe하지 않아, 구독을 신청/취소하는 동안 원하는 결과값을 얻기 힘들 수도있다.

이벤트를 순서대로 받지 못할 수도있다.

옵저버를 제때 제거해주지 않으면 메모리 누수가 일어날수 있다.(구독하지 않는 구독자를 그대로두고 신규 구독자만 늘어나는 경우

옵저버는 해당 구독자를 참조하고있기 때문에 계속 메모리를 잡아먹고있다.)

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] Enum 추상 클래스  (0) 2022.04.05
[Java] Stream  (0) 2022.04.01
[Java] 팩토리 디자인 패턴  (0) 2022.03.30
[Java] lombok의 setter/getter 메소드 생성 시점문의  (0) 2022.03.30
[Java] Enum 클래스  (0) 2022.03.29