반응형

 

 

 

 

기본 변하지 않는 클래스의 계층 구조에서 변하는 부분의 클래스의 추가, 정의 등이 필요할때

 

기존 구조를 거의 무너트리지 않고 변하는 부분을 만들 수 있는데 그것을 스트레티지 패턴이라 한다

 

 

point 는 포함 관계로 변화되는 클래스를 변하지 안흔 클래스의 부모에 포함 시켜서

 

클래슬르 만들때 원하는 행동의 클래스를 업케스팅해주면 된다

 

 

또한 기존에 돌아 가고 있던 행동을 쉽게 교체 하기 위해서도 많이 쓰인다

 

 


 

 

 

http://tongins.blog.me/80096279721

 

[패턴] Strategy Pattern  


복사http://tongins.blog.me/80096279721
 

 


 




스트레티지 패턴은 런타임 시점에서 알고리즘을 선택할 수 있는 독특한 디자인 패턴입니다.
이 패턴은 객체 지향 언어의 특성인 다형성을 사용한 패턴입니다.
스트레티지 패턴은 어플리케이션이 동작하는 상황에서 해당 기능에 대한 알고리즘을 교체하고자 할때 유용합니다.
이 패턴의 이름이 Strategy라고 불리우는 이유는 전쟁중에 이기기위해 싸우는 수단을 다양하게 바꾸는 상황과 프로그램이 동작하는 중에 알고리즘을 동적으로 교체하는 상황이 비슷하기 때문일 것입니다. 

 

 

스트레티지 패턴은 복잡하거나 어려운 패턴은 아닙니다.

프로그래밍을 하다 보면 if문을 제거하고 싶어질 때가 있습니다.

이때 자연스럽게 스트레티지 패턴을 만들어서 사용하게 될 때가 있습니다.

 

 

 

 

 

 

위 다이어 그램에 대한 C# 소스는 아래와 같습니다.

  1. using System;
  2.  
  3. namespace Pattern.Strategy
  4. {
  5.     class MainApp
  6.     {
  7.         static void Main()
  8.         {
  9.             Context context;
  10.  
  11.             // Three contexts following different strategies
  12.             context = new Context(new ConcreteStrategyA());
  13.             context.ContextInterface();
  14.  
  15.             context = new Context(new ConcreteStrategyB());
  16.             context.ContextInterface();
  17.  
  18.             context = new Context(new ConcreteStrategyC());
  19.             context.ContextInterface();
  20.  
  21.             // Wait for user
  22.             Console.ReadKey();
  23.         }
  24.     }
  25.  
  26.     /// <summary>
  27.     /// The 'Strategy' abstract class
  28.     /// </summary>
  29.     abstract class Strategy
  30.     {
  31.         public abstract void AlgorithmInterface();
  32.     }
  33.  
  34.     /// <summary>
  35.     /// A 'ConcreteStrategy' class
  36.     /// </summary>
  37.     class ConcreteStrategyA : Strategy
  38.     {
  39.         public override void AlgorithmInterface()
  40.         {
  41.             Console.WriteLine(
  42.                 "Called ConcreteStrategyA.AlgorithmInterface()");
  43.         }
  44.     }
  45.  
  46.     /// <summary>
  47.     /// A 'ConcreteStrategy' class
  48.     /// </summary>
  49.     class ConcreteStrategyB : Strategy
  50.     {
  51.         public override void AlgorithmInterface()
  52.         {
  53.             Console.WriteLine(
  54.                 "Called ConcreteStrategyB.AlgorithmInterface()");
  55.         }
  56.     }
  57.  
  58.     /// <summary>
  59.     /// A 'ConcreteStrategy' class
  60.     /// </summary>
  61.     class ConcreteStrategyC : Strategy
  62.     {
  63.         public override void AlgorithmInterface()
  64.         {
  65.             Console.WriteLine(
  66.                 "Called ConcreteStrategyC.AlgorithmInterface()");
  67.         }
  68.     }
  69.  
  70.     /// <summary>
  71.     /// The 'Context' class
  72.     /// </summary>
  73.     class Context
  74.     {
  75.         private Strategy _strategy;
  76.  
  77.         // Constructor
  78.         public Context(Strategy strategy)
  79.         {
  80.             this._strategy = strategy;
  81.         }
  82.  
  83.         public void ContextInterface()
  84.         {
  85.             _strategy.AlgorithmInterface();
  86.         }
  87.     }
  88. }

관련 URL:

http://www.cumps.be/design-patterns-strategy-pattern/

http://en.wikipedia.org/wiki/Strategy_pattern

 

 

반응형

+ Recent posts