본문 바로가기
컴퓨터공학/디자인패턴

[GoF] 전략 패턴

by 일상 속 둔치 2020. 7. 5.

출처 : https://ko.wikipedia.org/wiki/전략_패턴

프로그래밍을 하다보면 if문으로 상황에 따른 조건을 지정해주는 경우가 있다. 가령 다음과 같은 경우이다.

public fun example(item: List<Item>): Int{

  var sum = 0

  for(i in 0..item.size()){
    if(item[i] == 1){
        sum += 1
    }
    else if(item[i]%2 == 0){
        sum += 2
    }
    else{
        sum -= 1
    }
  }

  return sum
}

이때, 조건이 다양해 질 수록 if문이 복잡해지기 마련이다.

 

그래서 해당 조건에 따른 행동을 interface로 지정하고 상황에 따라서 interface를 implement한 객체를 지정해준다.

 

코드로 확인해보자.

public class Example{

  private var strategy = Strategy()

  public Example(strategy: Strategy){
  	this.strategy = strategy
  }
  
  public fun example(items: List<Item>): Int{
      var sum = 0;

      for(item in items){
          sum +=strategy.sumFunc(item)
      }

      return sum
  }
}

위처럼 코드를 줄일 수 있으며 조건이 늘어난다고해도 위의 코드는 수정하지 않아도 된다.

 

그렇다면 인터페이스를 어떻게 선언하고 구현하는지 확인해보자.

interface Strategy{
	fun sumFunc()
}

원하는 상태만큼 위의 interface를 상속 받은 클래스를 선언해주고 각 전략에 맞는 함수 구현을 해주면된다.

전략 변화가 필요할 때에(button 눌렸을 때 등) Example 클래스에 startegy 객체만 원하는 클래스로 변경만 해주면된다. 해당 방법을 구현하는 것은 Example에 strategy setter를 이용하여 구현할 수 있을 것이다.

 

public class Example{

  private var strategy = Strategy()

  public Example(strategy: Strategy){
  	this.strategy = strategy
  }
  
  public fun example(items: List<Item>): Int{
      var sum = 0;

      for(item in items){
          sum +=strategy.sumFunc(item)
      }

      return sum
  }
  
  public fun onFirstButton(){
  	strategy = FirstStrategy()
  }
  
  public fun onAfterButton(){
  	strategy = AfterStrategy()
  }
}

 

-끝-

댓글