디자인 패턴
디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 해결할 수 있도록 하나의 ‘규약’ 형태로 만들어 놓은 것
중복 코드 방지, 의존성 제거, 유지 보수 개선 등 코드의 더 좋은 구조를 만드는 것을 도와주는 코드 작성방법입니다.
전략 패턴
동일한 문제를 여러 ‘캡슐화한 알고리즘’으로 필요할 때마다 교체해서 해결할 수 있게 하는 디자인 패턴입니다.
카카오페이로 결제하는 객체가 있는 상황을 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()
전략 패턴은 팩토리 메소드 패턴과 유사합니다. 일종의 의존성 주입이고 전략 패턴은 행위(함수)를 외부에서 호출한다는 점, 팩토리 메소드 패턴은 객체의 생성을 외부에서 호출한다는점이 다릅니다.
※ 잘못된 정보, 혹은 다른 의견이 있다면 댓글로 말해주세요. 감사합니다.