옵서버 패턴
데이터의 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용하다. 예를 들어 새로운 파일이 추가되거나 기존의 파일이 삭제되었을 때 탐색기는 이를 즉시 표시할 피룡가 있다. 탐색기를 복수 개 실행하는 상황이나 하나의 탐색기에서 파일 시스템을 변경했을 때는 다른 탐색기에게 즉각적으로 이 변경을 통보해야 한다.
옵서버 패턴은 통보 대상 객체의 관리를 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
'Java > Java 객체지향 디자인 패턴' 카테고리의 다른 글
[Java 객체 지향 디자인 패턴] 10. 데커레이터 패턴 - 여러 기능의 조합 (0) | 2022.05.10 |
---|---|
[Java 객체 지향 디자인 패턴] 8. 커맨드 패턴 - Command Pattern : 기능의 캡슐화 (0) | 2022.03.17 |
[Java 객체 지향 디자인 패턴] 7. 스테이트 패턴 - State Pattern : 상태의 캡슐화 (0) | 2022.03.14 |
[Java 객체 지향 디자인 패턴] 6. 싱글턴 패턴 - Singleton Pattern : 단하나! 비동기 시 주의 (0) | 2022.02.23 |
[Java 객체 지향 디자인 패턴] 5. 스트래티지 패턴 - Strategy Pattern~! 전략 패턴~! (0) | 2022.02.23 |
댓글