본문 바로가기
CS/디자인 패턴

전략 패턴

by KDGdev 2023. 1. 29.

디자인 패턴


디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 해결할 수 있도록 하나의 ‘규약’ 형태로 만들어 놓은 것

 

중복 코드 방지, 의존성 제거, 유지 보수 개선 등 코드의 더 좋은 구조를 만드는 것을 도와주는 코드 작성방법입니다.

 

전략 패턴


동일한 문제를 여러 ‘캡슐화한 알고리즘’으로 필요할 때마다 교체해서 해결할 수 있게 하는 디자인 패턴입니다.

 

 

카카오페이로 결제하는 객체가 있는 상황을 kotlin 코드로 보겠습니다.

class Payment {
    fun pay(){
        println("카카오페이로 결제를 진행합니다")
    }
}

해당 객체에 네이버페이로 결제하는 방식을 추가하고 싶은 경우 다음과 같습니다.

class Payment {
    fun pay(type: String){
        when(type){
              "kakao pay" -> println("카카오페이로 결제를 진행합니다")
              "naver pay" -> println("네이버페이로 결제를 진행합니다")
              ...
              else -> ...
        }
    }
}

 

이렇듯 새로운 결제 방식을 추가하거나 기존 결제 방식을 삭제할 때 기존 코드를 변경해야 하므로 개방 폐쇄 원칙(OCP)을 위반하게 됩니다.

 

이를 전략 패턴을 사용하여 해결해 보겠습니다.

interface PaymentStrategy {
    fun payment(): String
}

class KakaoPay : PaymentStrategy {
    override fun payment(): String {
        return "카카오페이로 결제를 진행합니다"
    }
}

class NaverPay : PaymentStrategy {
    override fun payment(): String {
        return "네이버페이로 결제를 진행합니다"
    }
}

class Payment(val paymentStrategy: PaymentStrategy) {
    fun pay(){
        println(paymentStrategy.payment())
    }
}

 

결제 방법을 인터페이스로 구현하고 구체적인 방법을 하위 클래스로 캡슐화합니다.

이러한 방법을 통해 새로운 결제 방식을 추가하거나 기존 결제 방식을 삭제할 때 기존 코드를 변경하지 않고 새로운 하위클래스를 만들거나 기존 클래스를 삭제하면 됩니다.

 

클라이언트는 아래와 같은 방식으로 사용 가능합니다.

val kakaoPay = Payment(KakaoPay())
kakaoPay.pay()

 

 

전략 패턴은 팩토리 메소드 패턴과 유사합니다. 일종의 의존성 주입이고 전략 패턴은 행위(함수)를 외부에서 호출한다는 점, 팩토리 메소드 패턴은 객체의 생성을 외부에서 호출한다는점이 다릅니다.

 

 

※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.

 

'CS > 디자인 패턴' 카테고리의 다른 글

MVP 패턴  (0) 2024.06.27
MVC 패턴  (0) 2024.06.26
퍼싸드 패턴  (0) 2023.02.03
팩토리 패턴  (0) 2023.01.24
싱글톤 패턴  (0) 2023.01.24