Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코틀린
- 디자인패턴 #
- 추상팩토리패턴
- Kotlin
- designPattern
- a
- Functional Programming
- 옵저버 패턴
- F
- 함수형프로그래밍
- factory method
- 디자인패턴
- Singleton
- 싱글톤
- ㅓ
- 추상 팩토리
- El
- 빌터패턴
- ㅋㅁ
- 프로토타입 패턴
- builderPattern
- Design Pattern
- 팩토리 메소드
- Observer Pattern
- r
- Abstract Factory
- PrototypePattern
Archives
- Today
- Total
오늘도 더 나은 코드를 작성하였습니까?
Observer pattern(옵저버 패턴) 본문
옵저버 패턴 정의
- 특정 객체의 상태가 변화하면 그 객체에 의존하는 다른 객체에게 알림이 가고 자동으로 내용이 갱신되는 방식으로 일대다 의존성을 정의합니다.
*주제와 관찰자 객체간의 느슨한 결합을 통해 구현한다.
기본 인터페이스
interface Observer {
fun update()
}
interface Subject {
fun registerObserver(observer: Observer)
fun removeObserver(observer: Observer)
fun notifyObserver()
}
주제(RoadTrafficCorporation) 및 상태(SubWaySchedule) 클래스
class SubWaySchedule(val num: Int, var start: String = "05:00", var end: String = "23:00")
class RoadTrafficCorporation : Subject {
private val _scheduleList: MutableList<SubWaySchedule> =
mutableListOf(
SubWaySchedule(num = 1),
SubWaySchedule(num = 2),
SubWaySchedule(num = 3),
)
val scheduleList: List<SubWaySchedule>
get() = _scheduleList
private val _subscriber: MutableList<Observer> = mutableListOf()
val subscriber: List<Observer>
get() = _subscriber
fun changeSchedule(num: Int, start: String, end: String){
val schedule = _scheduleList[num-1]
schedule.start = start
schedule.end = end
notifyObserver()
}
override fun registerObserver(observer: Observer) {
_subscriber.add(observer)
}
override fun removeObserver(observer: Observer) {
_subscriber.remove(observer)
}
override fun notifyObserver() =
_subscriber.forEach { observer ->
observer.update()
}
}
관찰자 클래스
class KaKaoMap(val rtc: RoadTrafficCorporation) : Observer {
init {
rtc.registerObserver(this)
}
override fun update(num: Int) {
rtc.scheduleList[num]
println("kakao::${rtc.scheduleList[num]} 시간표 변경")
}
}
class NaverMap(val rtc: RoadTrafficCorporation) : Observer {
init {
rtc.registerObserver(this)
}
override fun update(num: Int) {
rtc.scheduleList[num]
println("naver::${rtc.scheduleList[num]} 시간표 변경")
}
}
class GoogleMap(val rtc: RoadTrafficCorporation) : Observer {
init {
rtc.registerObserver(this)
}
override fun update(num: Int) {
rtc.scheduleList[num]
println("google::${rtc.scheduleList[num]} 시간표 변경")
}
}
fun main() {
val roadTrafficCorporation = RoadTrafficCorporation()
val kaKaoMap = KaKaoMap(roadTrafficCorporation)
val naverMap = NaverMap(roadTrafficCorporation)
val googleMap = GoogleMap(roadTrafficCorporation)
roadTrafficCorporation.changeSchedule(2, "06:00", "23:00")
roadTrafficCorporation.removeObserver(kaKaoMap)
println("---------------------------------------------------------------")
roadTrafficCorporation.removeObserver(kaKaoMap)
roadTrafficCorporation.changeSchedule(1,"05:00", "24:00")
}
'디자인패턴' 카테고리의 다른 글
Decorator Pattern (데코레이터 패턴) (0) | 2022.07.25 |
---|---|
느슨한 결합과 강한 결합 (0) | 2022.07.18 |
전략패턴(Strategy Pattern) (0) | 2022.07.11 |
Dependency Inversion Principle (0) | 2021.12.28 |
Interface Segregation (0) | 2021.12.28 |