GOF 디자인 패턴에서 정의한 전략 패턴의 의도
- 알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.
전략 패턴은 변하지 않는 로직(부가 기능)을 Context라는 곳에 두고, 변하는 부분(핵심 기능)을 Strategy 라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 하여 문제를 해결한다.
-> 상속이 아닌 위임으로 템플릿 메서드 패던의 문제 해결
Context - 변하지 않는 템플릿 역할
Strategy - 변하는 알고리즘
// 템플릿 역할을 할 Context.class
class Context{
fun template(strategy: Strategy){
//부가 기능
strategy.logic() // 비즈니스 로직
//부가 기능
}
}
// 구현해야할 비즈니스 로직을 가지고 있는 인터페이스
Interface Strategy{
fun logic()
}
// 비즈니스 로직을 구현할 StrategyLogic.class
Class StrategyLogic(): Strategy{
override fun logic(){
// 비즈니스 로직 구현
}
}
// 사용
Class class(){
fun use(){
// 클래스를 생성하여 구현
val context = Context()
val strategyLogic = StrategyLogic()
context.template(strategyLogic)
// or
// 익명 추상 클래스 사용
val context = Context()
context.template(object: Strategy{
override fun logic(){
// 비즈니스 로직 구현
}
}
}
}
- 템플릿 역할의 Context의 코드가 변해도 비즈니스 로직 구현에 영향을 끼치지 않는다.
- 실행 시 마다 로직을 유연하게 바꿀 수 있다. (단점이자 장점)
템플릿 콜백 패턴
- 콜백이란 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수 있고, 나중에 실행할 수도 있다.( = 전략 패턴 )
- 스프링에서 xxxTemplete 클래스들을 템플릿 콜백 패턴을 적용하여 구현
'Spring' 카테고리의 다른 글
[Spring] 빈 후처리기 - BeanPostProcessor (0) | 2021.11.08 |
---|---|
[Spring] 프록시 팩토리 (0) | 2021.11.08 |
[Spring] 프록시 패턴 (0) | 2021.11.05 |
[Spring] 템플릿 메서드 패턴 (0) | 2021.11.05 |
[Spring] 동시성 문제 + 해결 방법 (쓰레드 로컬) (0) | 2021.11.05 |