
이렇게 생긴 버튼들의 집합을 구현하기 위해 ButtonsView라는 클래스를 만들었습니다.
그리고 ViewContoller와 Delegate를 통해 데이터를 주고받도록 했습니다.
사실 ButtonsView 클래스에서 onTapLike() 와 같은 함수를 두어서 buttonsView.onTapLike() 이런식으로 직접 조작을 할 수도 있었을 것입니다.
하지만, 왜 Delegate Pattern을 "굳이" 썼는지 정리해보고자 합니다.
1. 구조

VC는 Delegate를 구현하는 방식으로 의존하고, ButtonsView는 Delegate를 선언하고 사용하는 방식으로 의존합니다.
ButtonsView 입장에서는 함수들을 "직접 구현"하는 것이 아니라, "위임"하게 됩니다. 그래서 명칭이 Delegate Pattern입니다.
2. 역할 분리
이러한 측면에서, Delegate Pattern은 역할 분리를 할 수 있도록 합니다.
예를 들어, ButtonsView에서 '좋아요' 버튼을 눌러 서버 요청을 보내는 코드를 직접 구현한다면, 올바르지 못한 역할을 부여하는 것입니다.
뷰를 그리는 것이 아닌 네트워크 요청을 하고 있기 때문입니다.
따라서, ButtonsView 클래스에서 delegate.onTapLike() 와 같은 방식으로 위임한다면 역할을 분리할 수 있습니다.
물론, 이를 구현하는 VC에서도 VM을 활용해서 네트워크 요청을 처리해야 합니다.
3. 재사용성
만약 delegate를 쓰지 않고 다른 VC가 onTapLike함수를 다르게 구현하고 싶으면 어떻게 해야 할까요?
onTapLike가 다른 ButtonsView 클래스를 또하나 만들어야 할 것입니다.
delegate를 쓴다면 새로 추가된 VC에서 delegate 구현부를 수정하기만 하면 됩니다.
이런 측면에서, delegate pattern은 재사용성을 향상시키는 데에 유리합니다.