| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- mongo
- array
- 회고
- CS
- 주간회고
- javascript
- 기록
- mysql
- react
- 코테
- WIL
- mongoose
- Git
- js
- til
- Grafana
- 생각로그
- 네트워크
- 피드백
- 트러블슈팅
- typescript
- Java
- nest.js
- 생각일기
- 자바스크립트
- MongoDB
- 리눅스
- next.js
- 생각정리
- 알고리즘
- Today
- Total
코딩일상
Template Pattern, Strategy Pattern 패턴 본문
안녕하세요 개발자 Alex입니다.
오늘은 오브젝트 서적을 읽다가 나왔던 디자인 패턴중 하나인 Template Pattern를 정리 해보고자합니다.
그리고 이와 더불어 Template Pattern 과 자칫 헷갈릴수있는 Strategy Pattern 도 같이 묶어서 정리해보고자합니다.
그럼 시작해보겠습니다.
우선 한줄 요약으로 이 2가지 패턴을 소개하자면 아래와같습니다.
- Template Method Pattern: "알고리즘의 뼈대는 고정, 일부 단계만 상속으로 변경"
- Strategy Pattern: "알고리즘 자체를 통째로 교체, 합성(위임) 으로 변경"
*GoF(Design Patterns, 1994) 정의 기반
1.TemplateMethodPattern
늘 그렇듯 정의로 만 하면 역시 잘 와닿지않으므로 코드로서 해당 디자인 패턴을 보겠습니다.
abstract class PaymentProcess {
// 템플릿 메서드: 알고리즘의 뼈대
public final void process() {
validate();
pay();
notifyUser();
}
protected abstract void pay();
protected void validate() {
System.out.println("결제 검증");
}
protected void notifyUser() {
System.out.println("결제 완료 알림");
}
}
class CardPayment extends PaymentProcess {
@Override
protected void pay() {
System.out.println("카드 결제");
}
}
늘 그렇지만 패턴이 중요한건 아니라고 생각합니다.
이런 구조를 언제 사용하면 좋은가 더 스스로 잘 인지 하고 사용하는것이 더 좋은 자세라고 생각합니다.
그래서 Template Method 패턴의 경우는 아래의 경우 사용하면 좋은 패턴이라고생각합니다.
1. 알고리즘 전체 흐름은 반드시 동일해야한다.
2.그중 일부 단계만 제한적 커스터마이징 해야하는 경우
3. 상속 구조가 자연스러우며 클래수 수가 제한 적인 경우
만약 여기서 Template Method 패턴을 사용하지 않고 하였더라면
이렇게 개발을진행했을수도 있습니다.
if (type.equals("CARD")) {
validate();
cardPay();
notify();
} else if (type.equals("BANK")) {
validate();
bankPay();
notify();
}
상당히 중복되는 코드가 많아지는 것을 볼수있습니다.
2.Strategy Pattern 패턴
전략패턴 말그대로 전략 자체를 바꾸는 것입니다 흐름에서 일부를 바꾸었던 Template Method Pattern 와는 결이 다르게 새로운 흐름으로 변경이 될때 사용하는 패턴입니다.
정의: 행위를 클래스로 캡슐화하여 런타임에 알고리즘을 교체할 수 있도록 하는 패턴
*GoF 정의 기반
이것 역시 코드로 보시죠
interface DiscountStrategy {
int discount(int price);
}
class RateDiscount implements DiscountStrategy {
public int discount(int price) {
return price * 90 / 100;
}
}
class FixedDiscount implements DiscountStrategy {
public int discount(int price) {
return price - 1000;
}
}
class OrderService {
private final DiscountStrategy discountStrategy;
public OrderService(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public int calculatePrice(int price) {
return discountStrategy.discount(price);
}
}
자바 표준으로 사용되는 코드로는 아래의코드가 있겠습니다.
List<String> names = List.of("kim", "park", "lee");
names.sort((a, b) -> a.length() - b.length()); // 길이 기준
names.sort(String::compareTo);
이 Strategy Pattern의 사용하기 좋을 경우는 아래와 같다고 볼수도 있다
1.알고리즘을 자주 바꿔야 함
2.런타임에 행위 선택이 필요
3.조건문(if/else, switch)을 제거하고 싶을 때
'개발 공부' 카테고리의 다른 글
| 템플릿 메서드 패턴 (Template Method Pattern) 정리 (0) | 2026.01.23 |
|---|---|
| [Next.js] dynamicImport?? 란 선 구현 후 배움 (1) | 2025.11.18 |
| [supabse] custom schema 사용시 발생 에러 error code name PGRST106 (0) | 2025.05.21 |
| [grafana] 대시보드 별 유저 권한 부여 하는 법 정리 (1) | 2024.10.23 |
| [grafana] export csv 한글깨짐 현상 해결법 (0) | 2024.10.17 |
