델리게이트 패턴
기술하는 데 필요한 두 종류의 객체를 구별하기 위해 빨간 물체그리고 파란색 물체로 표현
1. 문맥을 보자…
델리게이트 패턴은 디자인 패턴 중 하나로, 델리게이트가 있는 객체가다 다른 개체에게 업무를 위임하는 형태를 가짐
델리게이트, 즉 델리게이트가 있는 객체특정 이벤트 발생 시 해당 이벤트를 처리하는 함수 코드를 직접 작성하는 것보다 이벤트를 처리하는 코드를 구현하는 대리자 개체입니다.
참조 및 처리
(이벤트를 처리하는 함수 코드는 위임 객체쓰여진)
특정보기한 가지에만 집중하고 싶을 때 다른보기대신 처리해야 할 것 같은데…
규약?
프로토콜은 특정 기능을 수행하기 위한 필수 요소를 정의합니다.
규약 구현되지 않은 메서드, 정의되지 않은 속성이 선언만
프로토콜을 채택한 객체는 프로토콜에 정의된 메서드나 속성을 무조건 구현해야 합니다.
protocol OOTD: AnyObject {
var top: String
var bottom: String
var shoes: String
func explainOOTD()
}
- 프로토콜을 클래스에서만 사용할 수 있도록 AnyObject를 상속합니다.
class April12: OOTD{
var top = "shirt"
var bottom = "cargo pants"
var shoes = "super star black"
func explainOOTD(){
print("오늘은 \\(top)와 \\(bottom)을 매치해 힙찔룩을 완성했어용")
}
}
class April9: OOTD{
var top = "hoodie"
var bottom = "jogger pants"
var shoes = "air force 1"
func explainOOTD(){
print("오늘은 \\(top)와 \\(bottom)을 매치해 마실룩을 완성했어용")
}
}
- 위임 패턴을 구현하기 위해 프로토콜을 사용하는 이유는 무엇입니까? 클래스는 단일 상속만 지원하므로 프로토콜을 사용합니다.
.? - 프로토콜은 위임할 속성 또는 메서드에 대한 규칙을 정의하는 데 사용할 수 있습니다.
2. 대리자 패턴을 사용하는 시기와 이유는 무엇입니까?
델리게이트 패턴 언제?
- 동일한 작업을 수행해야 하지만 각 객체가 다른 작업을 처리하는 경우
- 뷰 컨트롤러 간에 데이터를 전달할 수 있습니다.
- 이벤트를 발생시키는 뷰 컨트롤러와 결과를 처리하는 뷰 컨트롤러가 다른 경우
델리게이트 패턴 왜? 장점은 무엇입니까?
- 더 쉬운 코드 재사용 및 유지 관리(델리게이트가 있는 객체델리게이트를 통해 함수를 호출하는 코드 한 줄을 작성하더라도, 대리인이 참조하는 객체실행되는 함수의 구현 코드에 따라 다를 수 있음)
3. 예를 들어보자…
첫 번째와 두 번째 뷰 컨트롤러에서 게임을 시작하는 버튼 클릭 시 세 번째 뷰 컨트롤러 실행
첫 번째 뷰 컨트롤러의 게임은 버튼을 열 번만 누르는 게임입니다.
두 번째 뷰 컨트롤러에 있는 게임은 버튼을 누를 때마다 랜덤 이미지가 나오는 게임(?)
|
|
|
HitGameViewController RandomGameViewController GameView 컨트롤러
다음과 같은 3개의 뷰 컨트롤러가 있는 경우:
1. 게임 프로토콜의 정의
2. GameView 컨트롤러에서 델리게이트 속성을 선언한 후 함수를 호출합니다.
삼. HitGameViewController그리고 RandomGameViewController 각각은 GameProtocol과 Protocol에 정의된 메소드를 채택합니다.
각 화신
4. 각각 뷰컨트롤러대리자 선언 = 셀프 인
- Delegate 패턴을 사용하지 않고 이 게임을 구현했다면?
GameView 컨트롤러아래 코드의 함수 호출 부분에서 (delegate?.hitClicked, delegate?.resultGame)
함수를 호출하는 대신 첫 번째 게임과 두 번째 게임에 대해 각각 고유한 함수를 구현해야 했을 것입니다.
(또는 두 개의 뷰콘을 만들거나…)
위에서 언급한 Delegate Pattern 사용의 장점을 다시 생각해보자!
더 쉬운 코드 재사용 및 유지 관리(델리게이트가 있는 객체델리게이트를 통해 함수를 호출하는 코드 한 줄을 작성하더라도, 대리인이 참조하는 객체실행되는 함수의 구현 코드에 따라 다를 수 있음)
→ GameView 컨트롤러delegate?.hitClicked(), delegate?.resultGame()을 호출하면 상황에 따라 다른 함수가 실행됩니다.
→ 상황에 따른 기타 기능 GameView 컨트롤러에서 구현할 필요 없음
Delegate Pattern@을 언제 사용해야 하는지도 재고해 봅시다!
이벤트를 발생시키는 뷰 컨트롤러와 결과를 처리하는 뷰 컨트롤러가 다른 경우
→ Hit 버튼 클릭 이벤트가 발생한 뷰 컨트롤러 GameView 컨트롤러그러나 결과를 처리하는 뷰 컨트롤러는 HitGameViewController그리고 RandomGameViewController 림
→ 이벤트 결과를 처리하는 뷰 컨트롤러 HitGameViewController 그리고 RandomGameViewController작성된 코드
동일한 작업을 수행해야 하지만 다른 개체에 대해 다른 작업을 수행해야 하는 경우
→ ‘Hit 버튼 클릭과 동일한 동작’ HitGameViewController 그리고 RandomGameViewController다른 내용을 다룰 때