[행위패턴]전략 패턴

K00·2023년 3월 3일
0
post-thumbnail

📝 전략패턴이란?

하나의 클래스가 많은 행동들을 정의하고,
이런 행동들이 그 클래스의 연산 안에서 복잡한 다중 조건문의 모습을 취할 때,
많은 조건문보다는 행동 각각을 전략(Strategy) 클래스로 만들고,
동적으로 행동의 변경이 필요한 경우 전략(Strategy)을 바꾸어 주는 것으로
알고리즘을 다양하게 변경할 수 있게 해주는 패턴이다.

디자인 패턴 : 전략패턴이란?📘

👍 전략패턴의 장점

  • 동일 계열의 관련 알고리즘이 생긴다 : Strategy 클래스 계층은 동일 계열의 알고리즘군을 정의하고, 알고리즘 자체의 재사용도 가능하게 한다.
  • Strategy를 사용하는 Composition클래스에 서브클래싱을 하지 않아도 된다 : 위의 예에서 AuthProgram 클래스에 서브클래싱을 사용하여 Auth 방법을 다르게 처리할 수도 있다. 그러나 이렇게 처리하게 되면 AuthProgram 자체의 행동과 Auth 알고리즘이 혼합되어 유지보수가 어려워진다. 따라서 Auth 알고리즘을 Strategy 클래스로 독립시키면 AuthProgram과 무관하게 알고리즘을 변형시킬 수 있고, 알고리즘을 바꾸거나 확장하기도 쉬워진다.
  • 조건문을 없앨 수 있다 : 서로 다른 행동이 하나로 묶이면 조건문을 사용해서 정확한 행동을 선택해야 한다. 그러나 서로 다른 Strategy 클래스의 행동을 캡슐화하면 이들 조건문을 없앨 수 있다.y

📕 예제

img

  • AuthProgram : AuthProgram을 사용하는 쪽에서 필요한 인증방식 객체(AuthStrategy의 구체클래스)를 AuthProgram에 주입해준다.
  • AuthStrategy (추상클래스) : 제공하는 모든 Auth 알고리즘에 대한 공통의 연산들을 정의한다. 그리고 해당이 안되면 오류메세지를 출력하도록함
  • OAuth, OAuth2, Basic (구체클래스) : AuthStrategy 추상클래스를 각각의 실제 Auth 알고리즘으로 구현한다.

1. 클래스 사용

//class형
class ProductStrategy {//추상클레스 
  print() {
    console.log('Error : auth() must be implement')
  }
}

class Block extends ProductStrategy {
  print(quantity) {
    return quantity * 5000 + '원'
  }
}
class Flower extends ProductStrategy {
  print(quantity) {
    return quantity * 1000 + '원'
  }
}
class Error extends ProductStrategy {
}

class ProductProgram {
  constructor (product) {
    this.product = product
  }

  calculrate (quantity) {
    return this.product.print(quantity)
  }
}

const block = new Block()
const flower = new Flower()
const err = new Error()

const programB = new ProductProgram(block)
const programF = new ProductProgram(flower)
const programE = new ProductProgram(err)

programB.calculrate(3) //15000원
programF.calculrate(3) //3000원
programE.calculrate(3) //'Error : auth() must be implement'

2. 함수 사용

function WaterMelon () {
  this.getPrice = function(quantity){
    return quantity * 4000
  }
}
function Orange () {
  this.getPrice = function(quantity){
    return quantity * 2000
  }
}

function FruitPrice () {

  this.kind

  this.setFruitChain = function(kind){
    this.kind = kind
  } 

  this.calc = function(quantity) {
    return this.kind.getPrice(quantity)
  }
}

const waterMelon = new WaterMelon()
const orange = new Orange()

const fruitPrice = new FruitPrice()

fruitPrice.setFruitChain(waterMelon)
fruitPrice.calc(4) //16000

fruitPrice.setFruitChain(orange)
fruitPrice.calc(2) //4000

Reference

FP in JS (자바스크립트로 접해보는 함수형 프로그래밍) - 함수 컴포지션, 커링
techblog
디자인패턴 - 전략 패턴(Strategy Pattern) in Javascript
전략 패턴

0개의 댓글