영권's
디자인 패턴(Behavioral) - Template Method 본문
Template Method
템플릿 메서드는 슈퍼클래스에서 알고리즘의 골격을 정의하지만 구조를 변경하지 않고 서브클래스가 알고리즘의 특정 단계를 재정의할 수 있도록 하는 행동 디자인 패턴입니다.
문제점 예시
예를 들어, 사용자는 다양한 형식(PDF, DOC, CSV)의 앱 문서를 제공하고 이러한 문서에서 일관된 형식으로 의미 있는 데이터를 추출하려고 합니다.
이때 doc,csv,pdf의 데이터 형식에 대한 처리는 다르지만 해당 데이터를 처리하고 분석하는 것은 동일할 것입니다.
알고리즘 구조를 그대로 두고 코드 중복을 제거하는 것이 좋을 것입니다.
클라이언트 코드와 관련된 또 다른 문제가 있었습니다.
처리 대상의 클래스에 따라 적절한 조치를 취하는 조건문이 많이 있을 수 있습니다.
세 가지 처리 클래스 모두에 공통 인터페이스 또는 기본 클래스가 있는 경우 클라이언트 코드에서 조건을 제거하고 처리 개체에서 메서드를 호출할 때 다형성을 사용할 수 있습니다.
해결책
템플릿 메소드 패턴은 알고리즘을 일련의 단계로 나누고, 이러한 단계를 메소드로 변환하고, 단일 템플릿 메소드 내부에 이러한 메소드에 대한 일련의 호출을 넣을 것을 제안합니다 .
단계는 이거나 abstract일부 기본 구현이 있을 수 있습니다.
알고리즘을 사용하려면 클라이언트가 자체 하위 클래스를 제공하고 모든 추상 단계를 구현하고 필요한 경우 재정의할 수 있습니다.
- Abstract Class는 알고리즘의 단계 역할을 하는 메서드와 이러한 메서드를 특정 순서로 호출하는 실제 템플릿 메서드를 선언합니다. 각 단계는 Abstract로 선언되거나 일부 기본 구현이 되어 있을 수 있습니다.
- Abstract Class는 템플릿 메서드를 구현합니다.
- 또한, 템플릿 메서드에서 사용하고 있는 추상 메서드를 선언합니다.
- 콘크리트 클래스는 모든 단계를 재정의할 수 있지만 템플릿 메서드 자체는 재정의할 수 없습니다.
- Abstract Class에서 정의되어 있는 추상 메서드를 구체적으로 구현합니다.
- 구현된 메서드는 Abstract Class의 템플릿 메서드에서 호출됩니다.
적용 가능성
- 클라이언트가 알고리즘의 특정 단계만 확장하고 전체 알고리즘 또는 해당 구조를 확장하지 않도록 하려면 템플릿 방법 패턴을 사용할 수 있습니다.
- 템플릿 방법을 사용하면 단일 알고리즘을 일련의 개별 단계로 변환하여 하위 클래스에서 정의된 구조를 그대로 유지하면서 쉽게 확장할 수 있습니다.
- 거의 동일한 알고리즘과 약간의 차이가 있는 클래스가 여러 개 있는 경우 이 패턴을 사용합니다. 따라서 알고리즘이 변경될 때 모든 클래스를 수정해야 할 수도 있습니다.
- 이러한 알고리즘을 템플릿 메서드로 전환하면 유사한 구현이 있는 단계를 슈퍼클래스로 끌어올 수 있어 코드 중복을 제거할 수 있습니다. 하위 클래스 간에 다른 코드는 하위 클래스에 남을 수 있습니다.
장점
- 클라이언트가 큰 알고리즘의 특정 부분만 재정의하도록 하여 알고리즘의 다른 부분에 발생하는 변경의 영향을 덜 받도록 할 수 있습니다.
- 중복 코드를 슈퍼클래스로 뺄 수 있습니다.
단점
- 일부 클라이언트는 제공된 알고리즘의 골격에 의해 제한될 수 있습니다.
- 하위 클래스를 통한 기본 단계 구현을 억제하여 Liskov Substitution Principle(Liskov 대체 원칙)을 위반할 수 있습니다.
- 템플릿 메서드는 더 많은 단계를 유지하기가 더 어려운 경향이 있습니다.
https://refactoring.guru/design-patterns/template-method
도서) Java 언어로 배우는 디자인 패턴 입문
'스터디 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴(Creational) - Factory Method (0) | 2021.09.15 |
---|---|
디자인 패턴(Behavioral) - Visitor (0) | 2021.09.10 |
디자인 패턴(Behavioral) - Observer (0) | 2021.08.29 |
디자인 패턴(Behavioral) - Memento (0) | 2021.08.20 |
디자인 패턴(Behavioral) - Iterator (0) | 2021.08.13 |