본문 바로가기

개발자/Programming

디자인 패턴 (전략 패턴)

반응형

C++ 디자인 패턴 : Strategy 패턴 (전략 패턴)

 알고리즘을 교체가능 하게 하는 패턴.
 - 알고리즘의 인터페이스를 정의하고, 각각의 클래스별로 캡슐화 한 후 사용.
 - 결과는 같으나 결과를 만드는 방법이 여러개인 경우 사용.

//전략 패턴 인터페이스
public interface IStrategy
{
	int Calculator(int a, int b);
}
//전략 패턴 클래스
public class PatternPlus : IStrategy
{
	public int Calculator(int a, int b)
    {
    	return a + b;
    }
}
//전략 패턴 클래스
public class PatternMinus : IStrategy
{
  public int Calculator(int a, int b)
  {
  	return a - b;
  }
}
public class Node
{
  private int data;
  // 패턴
  private IStrategy pattern;
  // 초기 데이터와 패턴을 설정한다.
  public Node(int data, IStrategy pattern)
  {
    this.data = data;
    this.pattern = pattern;
  }
  // 전략적으로 패턴을 바꾸기 위한 프로퍼티
  public IStrategy Pattern
  {
    get { return this.pattern; }
    set { this.pattern = value; }
  }
  // 데이터를 추가합니다. 패턴에 의해 계산됩니다.
  public void Add(int data)
  {
  	this.data = this.pattern.Calculator(this.data, data);
  }
}
// 결과 출력
public void Print()
{
  Console.WriteLine("Result - " + data);
}
}
class Program
{
  static void Main(string[] args)
  {
    var plus = new PatternPlus();
    var minus = new PatternMinus();
    //처음에는 plus 패턴을 넣습니다.
    var node = new Node(0, plus);
    // 10을 넣습니다. (DEBUG : 10)
    node.Add(10);
    // 5을 넣습니다. (DEBUG : 15)
    node.Add(5);
    // 패턴을 바꿉니다.
    node.Pattern = minus;
    // 1을 넣습니다. (DEBUG : 14)
    node.Add(1);
    // 3을 넣습니다. (DEBUG : 11)
    node.Add(3);
    // 패턴을 바꿉니다.
    node.Pattern = plus;
    // 1을 넣습니다. (DEBUG : 12)
    node.Add(1);
    // 결과는 12가 나옵니다.
    node.Print();
    Console.WriteLine("Press any key...");
    Console.ReadKey();
  }
}


Add라는 함수를 호출할 때 Pattern에 따라 값이 바뀐다.

Java, C#의 라이브러리를 보면 이런 식으로 구성되어 있는 클래스들이 많다.

결국 Startegy pattern은 재사용성을 최대한 올려서 가독성과 성능을 올리고자 하는 목적의 패턴.

반응형