Java/Java 객체지향 디자인 패턴

[Java 객체 지향 디자인 패턴] 9. 옵서버 패턴 - 통보의 캡슐화

디벨로펄 2022. 5. 9.
반응형

옵서버 패턴

데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용하다. 예를 들어 새로운 파일이 추가되거나 기존의 파일이 삭제되었을 때 탐색기는 이를 즉시 표시할 피룡가 있다. 탐색기를 복수 개 실행하는 상황이나 하나의 탐색기에서 파일 시스템을 변경했을 때는 다른 탐색기에게 즉각적으로 이 변경을 통보해야 한다.

 

옵서버 패턴의 컬레보레이션

옵서버 패턴은 통보 대상 객체의 관리를 Subject 클래스와 Observer 인터페이스로 일반화 한다. 이를 통해 데이터 변경을 통보하는 클래스(ConcreteSubject)는 통보 대상 클래스나 객체(ConcreteObserver)에 대한 의존성을 없앨 수 있다. 결과적으로 옵서버 패턴은 통보 대상 클래스나 대상 객체의 변경에도 ConcreteSubject 클래스를 수정 없이 그대로 사용할 수 있도록 한다.

 

- Observer : 데이터의 변경을 통보 받는 인터페이스. 즉, Subject에서는 Observer인터페이스의 update메서드를 호출함으로써 ConcreteSubject의 데이터 변경을 ConcreteObserver에게 통보한다.

- Subject : ConcreteSubject 객체를 관리하는 요소. Observer 인터페이스를 참조해서 ConcreteObserver를  관리하므로 ConcreteObserver의 변화에 독립적일 수 있다. 

- ConcreteSubject : 변경 관리 대상이 되는 데이터가 있는 클래스. 데이터 변경을 위한 메서드인 setState가 있으며, setState에서는 자신의 데이터인 subjectState를 변경하고 Subject의 notifyObservers 메서드를 호출해서 ConcreteObserver 객체에 변경을 통보한다.

- ConcreteObserver : ConcreteSubject의 변경을 통보받는 클래스. Observer인터페이스의 update 메서드를 구현함으로써 변경을 통보 받는다. 변경된 데이터는 ConcreteSubject의 getStae메서드를 호출함으로써 변경을 조회한다.

 

 

예제

1-1. 구현된 각 클래스의 기능 설명.

Battery : 배터리

BatteryLevelDisplay : 현재 배터리 상태 display

LowBatteryWarning : 배터리 용량이 30보다 작을때 경고.

1-2. 클래스 다이어그램

1-3 실행 결과

Level : 80
Level : 30
Level : 20
<Warning> LowBattery : 20 Compared with 30

 

1-4. Battery설계의 취약점. OCP 측면에서 설명. Battery클래스 코드 중 OCP를 위반하는 부분을 명시하라.

현재는 Battery Level이 변화함에 따라 알림을 받는 객체가 BatteryLevelDisplay, LowBatteryWarning이지만, 추가적으로 알림을 받는 객체를 추가하고 싶을 경우 Battery 객체 자체를 수정해야하는 경우가 발생한다. 이는 OCP에 위반된다. 

 

1-5 Battery 클래스 설계의 취약점을 옵서버 패턴을 활용해 개선하는 방법을 설명하라.

Battery Level 변화의 알림을 받는 interface하고 Battery 객체에서는 해당 인터페이스를 객체로 가지도록 한다. 알림을 받는 interface는 복수개가 될 수 있으므로 list형태로 구성하며 add, remove 함수를 통해서 외부에서 의존성을 주입하도록 한다.

 

1-6. Battery 클래스, BatteryLevelDisplay 클래스, LowBattery, 클래스의 설계를 옵서버 패턴을 활용ㅇ해 개선한 모습을 클래스 다이어그램으로 표현하시오.

1-7 옵서버 패턴에 대응하는 클래스 명시

Subject : AbstractBattery

ConcreteSubject : Battery

Observer : BatteryLevelObserver

ConcreteObserver : BatteryLevelDisplay, LowBatteryWarning

 

1-8, 1-9 실제 코드 구현.

https://github.com/dhdnjswnd/JavaObjectiveDesignPattern/tree/main/src/chapter9

 

GitHub - dhdnjswnd/JavaObjectiveDesignPattern: 자바 객체지향 디자인패턴 공부자료

자바 객체지향 디자인패턴 공부자료. Contribute to dhdnjswnd/JavaObjectiveDesignPattern development by creating an account on GitHub.

github.com

 

 

연습문제 2번.

Observer : Observer 패턴의 observer interface

ConcreteObserver : ElevatorDisplay, FloorDisplay, ControlRoomDisplay, VoiceNotice

Subject : 옵서버 패턴의  Subject

ElevatorController : 옵서버 패턴의 concrete Subject

https://github.com/dhdnjswnd/JavaObjectiveDesignPattern/tree/main/src/chapter9/practice2

 

GitHub - dhdnjswnd/JavaObjectiveDesignPattern: 자바 객체지향 디자인패턴 공부자료

자바 객체지향 디자인패턴 공부자료. Contribute to dhdnjswnd/JavaObjectiveDesignPattern development by creating an account on GitHub.

github.com

클라이언트 출력 결과

반응형

댓글