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()  // 출력: 프리미엄 유저 로그인
}

결론

이처럼 전략 패턴을 사용하면, 클래스 내부를 수정하지 않고도 다양한 로그인 방식을 유연하게 적용할 수 있습니다. 새로운 로그인 방식이 추가되더라도 기존 코드를 수정하지 않고 새로운 클래스를 추가하는 방식으로 확장이 가능합니다. 전략 패턴은 행위의 변화를 유연하게 처리할 수 있도록 해주는 유용한 설계 패턴입니다.