[Architecture] 전략 패턴이란?

🌟 전략패턴

🎯 전략패턴이란?

전략패턴이란 특정한 컨텍스트단에서 로직을 분리하여 설계하는 패턴입니다 기능추가가 있을때 메인 컨텍스트를 건드리지 않고, 조건별로 달리 적용해야하는 것들에 대해서는 분리하여 개발합니다.

🎯 사용 예시

예시로 회원 등급별 할인이 다르게 적용된다고 가정해보았을때 기존코드가 아래와 같은 형식이라면

public class DiscountPerGrade(){
	public Integer discount( 회원 ){
		if(회원 == 프리미엄){
			프리미엄 할인 적용			
		}
		else if(회원 ==  일반){
			일반 할인 적용		
		}
		else{
		 	 할인적용 없음
		}
	}
}

전략패턴을 사용했을때는 다음과 같습니다.

1. 인터페이스로 분리

public interface DiscountPerGrade{
	Integer discount(회원);
}

2. 회원 등급별로 할인 적용 로직 구현

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(회원,아이템){
		할인적용 없음
	}
}

3. 회원정보를 파라미터로 전달(컨트롤러 -> 서비스)

4. 서비스에 주입 후 파라미터와 함께 계산

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문을 통해 조건을 적용하는 것이 더 좋을 수도 있습니다.

https://velog.io/@kyle/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%84%EB%9E%B5%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80


Written by@이주형
平常心

GitHubFacebook