- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩테스트
- datastructure
- 스위프트
- sort
- 코테
- swift split
- rxswift
- 정렬 알고리즘
- 프로그래머스
- 정렬알고리즘
- Design Pattern
- 정렬
- 자료구조
- 프로그래머스 레벨2
- 프로그래머스 swift
- 알고리즘
- 프로그래머스 level1
- 감성에세이
- 스위프트디자인패턴
- swift
- 다트
- swift 알고리즘
- programmers
- swift 코딩테스트
- coding test
- programmer
- Algorithm
- 디자인패턴
- dart
- 디자인 패턴
Bill Kim's Life...
[디자인패턴] Observer(옵저버) : 객체에서 발생하는 이벤트를 구독-전달 본문
[디자인패턴] Observer(옵저버) : 객체에서 발생하는 이벤트를 구독-전달
billnjoyce 2020. 6. 12. 17:40디자인패턴에의 Observer(옵저버)에 대하여 Swift를 기반으로 하여 살펴봅니다.
#. 구독 대상
- 컴퓨터 및 소프트웨어 공학과 관련자
- 소프트웨어 관련 종사자
- 기타 컴퓨터 공학에 관심이 있으신 분
- 디자인패턴의 개념을 잡고 싶으신 분
- 기타 소프트웨어 개발과 지식에 관심이 있으신 모든 분들
- Swift 언어를 활용하여 디자인패턴을 공부해보고 싶으신 분들
Observer(옵저버)
Observer(옵저버) 패턴은 특정 객체에서 발생하는 이벤트를 구독자에게 전달하는 패턴입니다.
Observer(옵저버) 패턴은 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동 되도록 1 대 N 객체간 의존 관계를 구성하는 디자인 패턴입니다.
구조
Observer(옵저버) 패턴을 UML로 도식화하면 아래와 같습니다.
Subject : 구독자(ConcreteObserver)가 이벤트를 받을 주요 주제 객체, 해당 Subject의 특정 이벤트 변경 시 구독하고 있는 구독자들이 해당 이벤트를 수신한다.
Observer : 구독자들의 부모가 되는 추상 클래스 객체
ConcreteObserver : Subject의 이벤트를 받게되는 구독자 객체
Implementation
// 구독할 주제 객체
class Subject {
var state: Int = { return Int(arc4random_uniform(10)) }()
private lazy var observers = [Observer]()
func attach(_ observer: Observer) {
print("Subject: Attached an observer.\n")
observers.append(observer)
}
func detach(_ observer: Observer) {
if let idx = observers.index(where: { $0 === observer }) {
observers.remove(at: idx)
print("Subject: Detached an observer.\n")
}
}
func notify() {
print("Subject: Notifying observers...\n")
observers.forEach({ $0.update(subject: self)})
}
func updateState() {
state = Int(arc4random_uniform(10))
notify()
}
}
// 구독자 부모 추상 객체
protocol Observer : class {
func update(subject: ObserverSubject)
}
// 실제 구독을 하는 객체
class ConcreteObserverA : Observer {
func update(subject: ObserverSubject) {
print("ConcreteObserverA - updated a state : \(subject.state)\n")
}
}
// 실제 구독을 하는 객체
class ConcreteObserverB : Observer {
func update(subject: ObserverSubject) {
print("ConcreteObserverB - updated a state : \(subject.state)\n")
}
}
let subject = ObserverSubject()
let observer1 = ConcreteObserverA()
let observer2 = ConcreteObserverB()
subject.attach(observer1) // Subject: Attached an observer.
subject.attach(observer2) // Subject: Attached an observer.
subject.updateState()
// ConcreteObserverA - updated a state : 6
// ConcreteObserverB - updated a state : 6
subject.updateState()
// ConcreteObserverA - updated a state : 1
// ConcreteObserverB - updated a state : 1
subject.detach(observer2) // Subject: Detached an observer.
subject.updateState()
// ConcreteObserverA - updated a state : 9
이상으로 Swift를 기반으로하여 Observer(옵저버) 디자인 패턴을 설명하였습니다.
감사합니다.
www.slideshare.net/BillKim8/swift-observer
github.com/billnjoyce/Lectures/tree/master/src/designpatterns
[참고 자료(References)]
[1] [Swift-Design Pattern] 옵저버 패턴(Observer pattern) : http://throughkim.kr/2019/09/05/swift-observer/
[2] Observer Pattern(swift) : https://linsaeng.tistory.com/6
[3] Observer Pattern in Swift : https://magicmon.github.io/2017/07/04/Observer-Pattern/
[4] Ch 8. Oberver Pattern : https://rhammer.tistory.com/348
[5] The observer pattern in Swift : https://medium.com/swift-coding/the-observer-pattern-in-swift-97a0e6fafa58
[6] Swift Design Pattern: Observer Pattern : https://medium.com/99ridho/swift-design-pattern-observer-pattern-fc009b783d19
[7] 굿바이~ 옵저버 패턴 and FRP : https://hamait.tistory.com/885
[8] Observer in Swift : https://refactoring.guru/design-patterns/observer/swift/example
[9] Design pattern in Swift - Observers : https://benoitpasquier.com/observer-design-pattern-swift/
[10] 옵저버 패턴 (Observer Pattern in Swift) : https://jerome.kr/entry/observer-pattern
'CS(컴퓨터 과학) > Design Patterns' 카테고리의 다른 글
[디자인패턴] Strategy(전략) : 클래스의 기능을 캡슐화하여 동적으로 변경 (0) | 2020.06.12 |
---|---|
[디자인패턴] Proxy(프록시) : 가상의 객체를 만들어서 흐름 제어 (0) | 2020.06.12 |
[디자인패턴] Flyweight : 객체 생성을 이미 있다면 공유 및 참조 (0) | 2020.06.12 |
[디자인패턴] Command(커맨드) : 실행될 기능을 캡슐화하여 여러 기능을 실행 (0) | 2020.06.12 |
[디자인패턴] Bridge(브릿지) : 기능과 구현을 분리하여 독립적 변경과 확장을 용이하게 하는 패턴 (0) | 2020.06.12 |