정의
- 객체지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라, 작업의 일부를 다른 객체에 넘기는 것
- (※공식적인 명칭 아님) 책임자(수신자), 준비자(대리자), 대리자에게 수신자 자신을 전달하는 3가지가 필요합니다.
- Delegate 패턴의 장점으로 코드의 재사용과 유지보수가 용이합니다.
예시
protocol
- tactics라는 이름의 프로토콜을 생성하겠습니다.
- 해당 프로토콜은 Cornerkick, Freekick이라는 메서드를 갖고 있습니다.
protocol tactics: class {
func Cornerkick()
func Freekick()
}
Class 1 : 책임자
- 책임자의 역할을 할 HeadCoach라는 클래스를 생성하겠습니다.
- 해당 클래스에서는 일을 위임할 delegate변수와 일을 시키는 order( ) 함수가 작성되어 있습니다.
- delegate변수의 자료형으로 tactics 프로토콜을 사용해, 이 delegate변수(위임자)가 프로토콜의 메서드를 실행시킬 수 있습니다.
- order( ) 함수는 delegate변수를 통해 tactics프로토콜의 메서드들을 실행시킬 수 있습니다.
class HeadCoach{
weak var delegate: tactics?
func order(){
self.delegate?.Cornerkick()
self.delegate?.Freekick()
}
}
Class 2 : 준비자
- tactics프로토콜의 채택하여 프로토콜 내의 메서드를 구현할 클래스를 생성했습니다.
- 두 클래스 모두 공통적으로 director.delegate = self라는 코드가 작성되어있습니다.
- 해당 코드는 책임자(HeadCoach)가 시키는 일을 자신이 처리하겠다고 명시한 것으로, 코드가 작성된 자신이 위임자의 일을 대신해서 처리하겠다는 의미입니다. ( 위임자의 delegate변수와 자신을 연결해주는 코드 )
class FirstTactics: tactics{
init(director: HeadCoach){
director.delegate = self
}
func Cornerkick() {
print("First Half Corner Kicker : Hargreaves")
}
func Freekick() {
print("First Half Free kicker : Gerrard")
}
}
class SecondTactics: tactics{
init(director: HeadCoach){
director.delegate = self
}
func Cornerkick() {
print("Second Half Corner Kicker : Cole")
}
func Freekick() {
print("Second Half Free kicker : Beckham")
}
}
객체
- 책임자로 Eriksson이라는 감독을 생성하였고, 두 개의 클래스를 각각 상수에 할당했습니다.
- Eriksson 감독에 지시에 따라 FirstHalf-Tactics, SecondHalf-Tactics의 일을 처리합니다.
- 전체코드를 보면 Eriksson이라는 HeadCoach(책임자)는 함수내의 값들을 직접 명시하지 않고,
각각 일을 위임받은 FirstTactics와 SecondTactics 준비자들이 준비한 방법을 처리만 하였습니다.
let Eriksson = HeadCoach()
let FirstHalf = FirstTactics(director: Eriksson)
Eriksson.order()
let SecondHalf = SecondTactics(director: Eriksson)
Eriksson.order()
실행결과
// First Half Corner Kicker : Hargreaves
// First Half Free kicker : Gerrard
// Second Half Corner Kicker : Cole
// Second Half Free kicker : Beckham
내용 출처
https://velog.io/@iwwuf7/Swift-Delegate-Pattern%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C
'iOS > iOS' 카테고리의 다른 글
스토리보드의 장단점 (0) | 2022.03.01 |
---|---|
Delegate,Block,Notification,KVO (0) | 2022.02.28 |
Frame과 Bounds의 차이 (0) | 2022.02.25 |
Class와 Struct의 차이 (0) | 2022.02.25 |
as, as?, as!의 차이 (0) | 2022.02.24 |
댓글