Delegate Pattern
π‘ νΉμ λ€λ₯Έ ν΄λμ€μ μλ μ΄λ ν νλμ νκ³ μΆμ λ,
μμμ μ¬μ©νλ λμ delegateλΌλ μμμλ₯Ό μ μΈνμ¬ λ€λ₯Έ ν΄λμ€μ νλμ μ¬μ¬μ©νλλ‘ νλ κ².
μ΄λ, μμν ν΄λμ€μ μμν λ΄μ©μ μμ λ°μ ν΄λμ€μ κ°μ²΄λ₯Ό μ°Έμ‘°νλλ‘ ν΄μ€μΌλλ€
*"Delegateλ μ΄λ€ κ°μ²΄κ° ν΄μΌ νλ μΌμ λΆλΆμ μΌλ‘ νμ₯ν΄μ λμ μ²λ¦¬λ₯Ό νλ€."*
delegate
λ μμμλΌκ³ ν΄μν μ μλ€.- μμμλ₯Ό κ°κ³ μλ κ°μ²΄κ° λ€λ₯Έ κ°μ²΄μκ² μμ μ΄ ν΄μΌνλ μΌμ μμνλ ννμ
λμμΈ ν¨ν΄
- ν΄λμ€ μμκ³Ό λμΌνκ²
μ½λλ₯Ό μ¬μ¬μ©
ν μ μλλ‘ νλκ°μ²΄ μ§ν₯ λμμΈ ν¨ν΄
μ΄λ€ - swift μμμ Delegate Pattern ꡬν :
- μ΄λ ν ν΄λμ€μμ νΉμ protocolμ typeμ κ°μ§λ
delegate
μμμ λ³μλ₯Ό κ°μ Έμ λ€λ₯Έ ν΄λμ€μ κ°μ²΄μκ² μμ μ ν μΌμ μμν μ μλ€→ μ optional typeμΌκΉ?
- μ΄λ ν ν΄λμ€μμ νΉμ protocolμ typeμ κ°μ§λ
- μ΄λ¬ν νΉμ protocolμ μ€μνλ classλ€μ
delegate class
λΌκ³ νλ€- μ΄λ¬ν
delegate class
λ€μdelegate
μμμ λ³μλ₯Ό κ°μ§κ³ μλ classμμ μ΄λ²€νΈλ₯Ό μ μ‘νλ©΄, μ΄λ²€νΈλ₯Ό κ°μ§νμ¬ λ리μ λ©μλλ₯Ό νΈμΆνλ€ (protocolμ κΈ°μ λμ΄ μλ λ©μλλ€) - μ¦ μμμλ₯Ό κ°κ³ μλ κ°μ²΄κ° ν΄μΌ νλ μΌμ€μ μΌλΆλΆμ 컀μ€ν νμ¬ λμ μ²λ¦¬λ₯Ό ν΄μ€λ€
- μ΄λ¬ν
μμ
protocol Area {
func area(width: Double, height: Double)
}
class Rectangle: Area {
//Window μΈμ€ν΄μ€μ λν μ°Έμ‘°
init(receiver: Window) {
receiver.delegate = self
}
func area(width: Double, height: Double) {
print(width * height)
}
}
class Window {
var delegate: Area?
}
var w = Window()
let r = Rectangle(receiver: w)
//Window ν΄λμ€κ° Rectangle μΈμ€ν΄μ€μκ² area() μ°μ°μ λ겨μ€λ€
w.delegate?.area(width: 40, height: 30)
- λ κ°μ²΄κ° νλμ μμ²μ μ²λ¦¬νλλ°, μμ κ°μ²΄κ° μ°μ°μ μ²λ¦¬λ₯Ό μμμμκ² λ³΄λΈλ€. (μλΈ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μκ² μμ² μ λ¬κ³Ό μ μ¬)
- (μ°μ° μ²λ¦¬μ κ²°κ³Όλ₯Ό λ°λ) μμ κ°μ²΄λ λ리μμκ² μμ μ 맀κ°λ³μλ‘ μ λ¬ν΄μ μμλ μ°μ°μ΄ μμ μλ₯Ό μ°Έμ‘°νκ² νλ€
- Window classλ₯Ό Rectangle classμ μλΈν΄λμ€λ‘ λ§λλ λμ , Window classλ Rectangle classλ₯Ό μμ μ μΈμ€ν΄μ€ λ³μλ‘ λ§λ€κ³ , Rectangle classμ μ μλ νλμ΄ νμν λλ§ Rectangle classμ μμν¨μΌλ‘μ¨ Rectangle classμ νλμ μ¬μ¬μ©ν μ μλ€
π‘ μ¦, μμμ μν΄ WindowμΈμ€ν΄μ€λ₯Ό Rectangle μΈμ€ν΄μ€λ‘ κ°μ£Όνλ κ²μ΄ μλ,
Window μΈμ€ν΄μ€κ° Rectangle μΈμ€ν΄μ€λ₯Ό ν¬ν¨νλλ‘ νκ³ ,
Window μΈμ€ν΄μ€κ° μμ μ΄ λ°μ μμ²μ Rectangle μΈμ€ν΄μ€λ‘ μ λ¬νλ κ²!
protocol Work {
func Coding(language: String)
func Reading(num: Int)
}
class Boss {
var delegate: Work?
}
class Employee1: Work {
init(supervisor: Boss) {
supervisor.delegate = self
}
func Coding(language: String) {
print("\(language)μΈμ΄λ‘ μ½λ©νλμ€..")
}
func Reading(num: Int) {
print("\(num)μ€μ§Έ μ½λ 리λ©μ€..")
}
}
class Employee2: Work {
init(supervisor: Boss) {
supervisor.delegate = self
}
func Coding(language: String) {
print("\(language)μΈμ΄λ‘ μ½λ©νλμ€..")
}
func Reading(num: Int) {
print("\(num)μ€μ§Έ μ½λ 리λ©μ€..")
}
}
var boss = Boss()
//bossμ delegateλ₯Ό sunnyλ‘
let sunny = Employee1(supervisor: boss)
//pythonμΈμ΄λ‘ μ½λ©νλμ€.. μΆλ ₯
boss.delegate?.Coding(language: "python")
//bossμ delegateλ₯Ό marcoλ‘
let marco = Employee2(supervisor: boss)
//4μ€μ§Έ μ½λ 리λ©μ€.. μΆλ ₯
boss.delegate?.Reading(num: 4)
Cocoa APIμμ μ¬μ©νλ Delegate Pattern
cocoaAPIμμλ UIλ₯Ό ꡬνν λ Delegate Patternμ μμ£Ό μ¬μ©νλ€κ³ νλ€
protocol NSWindowDelegate {
func window(NSWindow, willPositionSheet: NSWindow, using: NSRect) -> NSRect
}
//μμμ ν΄λμ€
//μ΄λ²€νΈ κ°μ§ -> λ리μ λ©μλ νΈμΆνλ€
//func window~ -> μ±μ΄ μ΄λ²€νΈμ μλ΅νλ λ°©μμΌλ‘ μ¬μ©μ μ§μ ν¨
class MyDelegate: NSObject, NSWindowDelegate {
func window(_ window: NSWindow, willUseFullScreenContentSize proposedSize: NSSize) -> NSSize {
return proposedSize
}
}
//NSWindow classμμ `var delegate: NSWindowDelegate?`λΌλ delegate λ³μ μ μΈ
let myWindow = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 5120, height: 2880),
styleMask: .fullScreen,
backing: .buffered,
defer: false
)
//myWindowμ μμμλ₯Ό μ§μ
myWindow.delegate = MyDelegate()
//μ¬μ©μκ° μ°½ ν¬κΈ°λ₯Ό μ‘°μ νμ¬ μ΄λ²€νΈ λ°μ!
//let eventResponse = myWindow.delegate?.window(myWindow, willUseFullScreenContentSize: mySize)
//μ μ½λμ κ°μ΄ μ΄λ²€νΈ μλ΅ν νμκ° μμΌλ©΄ μμμ μμ±ν νμ μλ€.
// μμμμκ²λ‘ λ©μΈμ§λ₯Ό 보λ΄κΈ°μ μ μ΅μ
λ 체μ΄λμ μ΄μ©νμ¬ ν΄λΉ windowμ μμμκ° μ‘΄μ¬νλμ§ νμΈνλ€!
if let fullScreenSize = myWindow.delegate?.window(myWindow, willUseFullScreenContentSize: mySize) {
print(NSStringFromSize(fullScreenSize))
}
ν΄λμ€ μμ
- μλΈν΄λμ±
- λ€λ₯Έ λΆλͺ¨ ν΄λμ€μμ μμλ°μ ν ν΄λμ€μ ꡬνμ μ μνλ κ²
- λ©μλ, νλ‘νΌν°μ λ€λ₯Έ νΉμ§λ€μ λ€λ₯Έ ν΄λμ€λ‘ λΆν° μμλ°μ μ μλ€
- μ μ₯ νλ‘νΌν°, κ³μ° νλ‘νΌν°μ μκ΄μμ΄ μμλ°μ νλ‘νΌν°μ
νλ‘νΌν° μ΅μ λ²
λ₯Ό μ€μ ν΄ κ° μ€μ μ λ°μν μ μλ€ νμ΄νΈλ°μ€
μ¬μ¬μ©
κ°μ²΄ ν©μ±
- ν΄λμ€ μμμ λν λμ
- λ€λ₯Έ κ°μ²΄λ₯Ό μ¬λ¬ κ° λΆμ¬μ μλ‘μ΄ κΈ°λ₯ νΉμ κ°μ²΄λ₯Ό ꡬμ±νλ κ² → κ°μ²΄ λλ λ°μ΄ν° μ νμ λ 볡μ‘ν μ νμ κ²°ν©νλ€
- κ°μ²΄λ₯Ό ν©μ±νλ €λ©΄, ν©μ±μ λ€μ΄κ°λ κ°μ²΄λ€μ μΈν°νμ΄μ€λ₯Ό λͺ ννκ² μ μν΄ λμ΄μΌν¨
λΈλλ°μ€
μ¬μ¬μ©
Delegate Patternλ₯Ό μ¬μ©νλ μ΄μ
- ν΄λμ€ μμκ³Ό κ°μ²΄ ν©μ±μ μ μ ν μ‘°ν©
- κ°μ²΄μ λ΄λΆλ₯Ό 곡κ°νμ§ μκ³ protocolμ ν΅ν΄μλ§ μ¬μ¬μ©λλ€ (λΈλλ°μ€ μ¬μ¬μ©)
- λ°νμμ νλμ 볡ν©μ κ°λ₯νκ² νκ³ , 볡ν©νλ λ°©μλ λ³κ²½ν΄μ€λ€
- ν΄λμ€μ μΊ‘μνμ μ 리!
- μμνκ³ μλ ν΄λμ€μ λ³νκ° λ°μνλλΌλ (ν¨μμ μΆκ° λ±) μμκ³Ό λ€λ₯΄κ² λ¬Έμ κ° λ°μνμ§ μλλ€ !
λ¨μ
- ν΄λμ€μ μνΈμμ©μ΄ λ€ μ μλμ΄ μμ§ μκ³ , λ°νμ μ delegateλ₯Ό μ μΈν κ°μ²΄μ λ°λΌ κ·Έ κ²°κ³Όκ° λ¬λΌμ§λ€
- → λ°νμμ λΉν¨μ¨μ
- → μ μ μΈ λμμΈ κ΅¬μ‘°λ³΄λ€ μ΄ν΄κ° μ΄λ €μ
- 볡μ‘ν¨ < λ¨μνμ ν¨κ³ΌμΌ κ²½μ°, μ΄λ¬ν
Delegate Pattern
μ μ¬μ©νλ κ²μ΄ μ 리νλ€
μ°Έκ³
Using Delegates to Customize Object Behavior