Strategy pattern
Exploring the concept of the Strategy pattern and its implementation in Kotlin
September 3, 2024
전략 패턴(Strategy Pattern)은 객체지향 설계에서 특정 행위를 다양한 알고리즘으로 캡슐화하여 유연하게 확장할 수 있도록 도와주는 디자인 패턴입니다. 이 패턴을 사용하면 기존 기능에서 수정이 필요한 부분이 생길 때, 변경되는 내용만 독립적으로 관리할 수 있어 코드의 확장성과 유지보수성이 크게 향상됩니다.
예제: 로그인 기능에 전략 패턴 적용
예제로, 유저 로그인 기능에 전략 패턴을 적용해 보겠습니다. 유저가 프리미엄 유저인지, 무료 유저인지에 따라 로그인 방식이 다를 수 있습니다. 이 경우, 전략 패턴을 사용하여 각 유저 타입별로 로그인 방식을 유연하게 변경할 수 있습니다.
1. Login 인터페이스 정의
먼저, 로그인 행위를 담당할 Login 인터페이스를 정의합니다.
interface Login {
fun login()
}
2. 로그인 전략 클래스 구현
유저 타입별로 다른 로그인 방식을 구현한 클래스를 작성합니다.
class PremiumLogin : Login {
override fun login() {
println("프리미엄 유저 로그인")
}
}
class FreeLogin : Login {
override fun login() {
println("무료 유저 로그인")
}
}
3. 유저 추상 클래스 및 구현 클래스 정의
이제 User라는 추상 클래스를 만들고, 이 클래스를 이용하여 프리미엄 유저와 프리 유저 클래스를 각각 구현합니다. 이렇게 함으로써 프리 유저와 프리미엄 유저 클래스 각각에게 별도의 함수와 클래스 변수를 사용 할 수 있습니다.
abstract class User(protected val loginStrategy: Login) {
fun performLogin() {
loginStrategy.login()
}
abstract fun userDetails() // 각 유저 타입별로 다른 세부 사항을 제공하기 위한 추상 메서드
}
class FreeUser : User(FreeLogin()) {
val freeContentLimit = 5
override fun userDetails() {
println("무료 유저 - 한 달에 $freeContentLimit 개의 무료 콘텐츠 이용 가능")
}
}
class PremiumUser : User(PremiumLogin()) {
val premiumContentLimit = 100
val premiumSupport = true
override fun userDetails() {
println("프리미엄 유저 - 무제한 콘텐츠 이용 및 프리미엄 지원 제공")
}
}
4. 전략 패턴을 적용한 로그인 실행
마지막으로, 유저 인스턴스를 생성하고 로그인 메서드를 호출합니다.
fun main() {
val freeUser = FreeUser()
val premiumUser = PremiumUser()
freeUser.performLogin() // 출력: 무료 유저 로그인
premiumUser.performLogin() // 출력: 프리미엄 유저 로그인
}
결론
이처럼 전략 패턴을 사용하면, 클래스 내부를 수정하지 않고도 다양한 로그인 방식을 유연하게 적용할 수 있습니다. 새로운 로그인 방식이 추가되더라도 기존 코드를 수정하지 않고 새로운 클래스를 추가하는 방식으로 확장이 가능합니다. 전략 패턴은 행위의 변화를 유연하게 처리할 수 있도록 해주는 유용한 설계 패턴입니다.