August 13, 2021
전략패턴이란 특정한 컨텍스트단에서 로직을 분리하여 설계하는 패턴입니다 기능추가가 있을때 메인 컨텍스트를 건드리지 않고, 조건별로 달리 적용해야하는 것들에 대해서는 분리하여 개발합니다.
예시로 회원 등급별 할인이 다르게 적용된다고 가정해보았을때 기존코드가 아래와 같은 형식이라면
public class DiscountPerGrade(){
public Integer discount( 회원 ){
if(회원 == 프리미엄){
프리미엄 할인 적용
}
else if(회원 == 일반){
일반 할인 적용
}
else{
할인적용 없음
}
}
}
전략패턴을 사용했을때는 다음과 같습니다.
public interface DiscountPerGrade{
Integer discount(회원);
}
Public class PremiumDiscount implements DiscountPerGrade{
@Override
public Integer discount(회원,아이템){
프리미엄 할인적용 로직
}
}
Public class BasicDiscount implements DiscountPerGrade{
@Override
public Integer discount(회원,아이템){
베이직 할인적용 로직
}
}
Public class NoneDiscount implements DiscountPerGrade{
@Override
public Integer discount(회원,아이템){
할인적용 없음
}
}
public class CalculatePrice(회원){
private final DiscountPerGrade discountPerGrade;
public CalculatePrice(DiscountPerGrade discountPerGrade){
this.discountPerGrade = discountPerGrade;
}
…이것저것 필요한 로직들…
public Integer calculateFinalPrice(구매 리스트,회원){
Integer total = 0;
for (회원이 산 아이템 : 구매리스트){
total += discountPerGrade.discount(회원,아이템);
}
return total;
}
}
컨텍스트에서 if-else문으로 분기처리를 하게 되면 조건이 많아질수록 반복적으로 else if문이 추가되면서 판단하는 코드가 길어집니다. 또한 이렇게 추가된 사항에 공통적으로 먹여야할 로직이 있고 만약 이가 복잡하고 얽혀있다면 단순한 복붙으로 해결하기 어려워질수도 있습니다. ( 애초에 복붙으로 로직을 관리하면 한글자 수정하더라도 복붙한 애들 일일히 다 다시 수정하러 가야하는 참사가 일어납니다…)
이런점에서 전략패턴을 사용하여 로직을 분리해놓는다면 컨텍스트문을 변경하지 않고도 조건을 추가할 수 있으며, 로직끼리도 분리되어있으므로 유연하게 추가,수정할 수 있다는 장점을 가집니다.
아무래도 가독성은 분기보다 떨어질 수 밖에 없어서 조건이 한두개에서 더 변경될 여지가 없거나, 로직이 너무 간단하면 If-else문을 통해 조건을 적용하는 것이 더 좋을 수도 있습니다.