디자인 패턴의 정의
- 패턴(Pattern)은 특정 컨텍스트 내에서 주어진 문제의 해결책이다.
- 컨텍스트(context)란 패턴이 적용되는 상황을 뜻합니다. 반복적으로 일어날 수 있는 상황이어야만 합니다.
- 문제(problem)란 컨텍스트 내에서 이뤄야 하는 목표를 뜻합니다. 여기에는 컨텍스트 내의 제약조건도 포함됩니다.
- 해결책(solution)이 바로 우리가 찾아내야 하는 것입니다. 제약조건 속에서 누가 적용해도 목표를 이룰 수 있는 일반적인 디자인을 뜻합니다.
- “어떤 컨텍스트 내에서 일련의 제약조건에 의해 영향을 받는 문제가 발생했다면, 그 제약조건 내에서 목적 달성을 위한 해결책이 되는 디자인을 적용하면 된다”
새로운 디자인 패턴 발견하기
- 숙제를 먼저 합시다.
- 새로운 패턴을 만들기 전에 기존 패턴을 확실하게 파악해야 합니다. 새로워 보이는 패턴도 잘 따져보면 기존 패턴을 변형한 것에 불과한 경우가 대부분이거든요. 패턴을 열심히 공부하다 보면 패턴을 알아보는 눈이 길러지고, 다른 패턴과 연관 짓는 능력도 발달합니다.
- 오랜 시간에 걸쳐서 심사숙고해 보세요.
- 패턴에 관한 아이디어는 여러분의 경험(여러분이 접해 본 문제와 사용했던 해결책)에서 나옵니다. 지금까지의 경험을 토대로 다시 한번 곰곰이 생각해 보고, 반복적으로 발생하는 문제를 해결할 수 있는 새로운 디자인이 되도록 다듬어야 합니다. 완전히 새로운 패턴이라고 생각되는 것도 기존 패턴을 변형한 것에 불과할 수 있다는 사실을 기억하세요. 새로운 패턴을 발견했다고 생각했는데 적용 범위가 너무 좁아서 진짜 패턴이라고 하기 힘든 것이 많으니까요.
- 머릿속에 들어있는 아이디어를 남들도 이해할 수 있도록 종이 위에 적어 보세요.
- 여러분이 발견한 것을 남들이 활용할 수 없다면 새로운 패턴을 발견한 의미가 전혀 없겠죠? 새로운 패턴을 발견한 것 같다면, 다른 사람들이 직접 적용해 보고 피드백을 제공할 수 있도록 문서로 만들어 보세요. 패턴을 문서화하는 방법은 고민하지 않아도 됩니다. 이미 GoF템플릿이 어떻게 생겼는지 알고 있잖아요. 패턴의 특성을 설명하는 방법은 이미 마련되어 있으니까, 그 문서 형식을 그대로 활용해서 여러분이 발견한 패턴을 문서로 작성하기만 하면 됩니다.
- 새로운 패턴을 다른 사람들이 사용하게 해서, 계속 다듬어 보세요.
- 패턴을 한 번에 완성하긴 힘듭니다. 새로운 패턴은 시간이 지남에 따라 점점 더 나아진다고 생각하세요. 다른 개발자들에게 여러분이 발견한 패턴을 시험해 볼 기회를 제공하고, 피드백을 얻어 보세요. 그리고 패턴을 설명하는 문서에 피드백을 반영하고, 다시 검증을 받는 과정을 여러 번 반복하세요. 완벽하게 만들기는 불가능하겠지만, 계속 고치다 보면 다른 개발자들이 읽고 이해하는 데 부족함이 없는 패턴 문서를 만들 수 있습니다.
- 3의 규칙을 잊지 마세요.
- 패턴이 실전 문제 해결에 3번 이상 적용되어야 패턴 자격을 얻을 수 있다는 점을 절대 잊지 마세요. 이 이유 때문에라도 다른 사람들에게 새로운 패턴을 테스트할 기회를 제공해야 합니다. 그 과정에서 점점 더 제대로 된 패턴에 가까워지죠.
누가 무엇을 할까요?
- 데코레이터 패턴
- 상태 패턴
- 상태를 기반으로 하는 행동을 캡슐화한 다음 위임으로 필요한 행동을 선택합니다.
- 반복자 패턴
- 컬렉션이 어떤 식으로 구현되었는지 드러내지 않으면서도 컬렉션 내에 있는 모든 객체를 대상으로 반복 작업도 처리할 수 있게 해 줍니다.
- 퍼사드 패턴
- 전략 패턴
- 교환 가능한 행동을 캡슐화하고 위임으로 어떤 행동을 사용할지 결정합니다.