전략 패턴

위키백과, 우리 모두의 백과사전.
둘러보기로 가기 검색하러 가기

전략 패턴(strategy pattern) 또는 정책 패턴(policy pattern)은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. 전략 패턴은

  • 특정한 계열의 알고리즘들을 정의하고
  • 각 알고리즘을 캡슐화하며
  • 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.

전략은 알고리즘을 사용하는 클라이언트와는 독립적으로 다양하게 만든다.[1] 전략은 유연하고 재사용 가능한 객체 지향 소프트웨어를 어떻게 설계하는지 기술하기 위해 디자인 패턴의 개념을 보급시킨 디자인 패턴(Gamma 등)이라는 영향력 있는 책에 포함된 패턴들 가운데 하나이다.

개요[편집]

전략[2] 디자인 패턴은 유연하고 재사용 가능한 객체 지향 소프트웨어를 설계하기 위해 반복되는 디자인 문제를 해결하는 방법, 즉 객체는 구현, 변경, 테스트, 재사용이 쉬워야 한다는 것을 기술하는, 잘 알려진 23가지 GoF 디자인 패턴들 중 하나이다.

구조[편집]

UML 클래스 및 시퀀스 다이어그램[편집]

전략 디자인 패턴을 위한 샘플 UML 클래스와 시퀀스 다이어그램.[3]

클래스 다이어그램[편집]

UML의 전략 패턴
LePUS3의 전략 패턴 (범례)

예시[편집]

C#[편집]

다음은 C#의 예이다.

 1 public class StrategyPatternWiki
 2 {
 3     public static void Main(String[] args)
 4     {
 5         Customer firstCustomer = new Customer(new NormalStrategy());
 6 
 7         // Normal billing
 8         firstCustomer.Add(1.0, 1);
 9 
10         // Start Happy Hour
11         firstCustomer.Strategy = new HappyHourStrategy();
12         firstCustomer.Add(1.0, 2);
13 
14         // New Customer
15         Customer secondCustomer = new Customer(new HappyHourStrategy());
16         secondCustomer.Add(0.8, 1);
17         // The Customer pays
18         firstCustomer.PrintBill();
19 
20         // End Happy Hour
21         secondCustomer.Strategy = new NormalStrategy();
22         secondCustomer.Add(1.3, 2);
23         secondCustomer.Add(2.5, 1);
24         secondCustomer.PrintBill();
25     }
26 }
27 
28 
29 class Customer
30 {
31     private IList<double> drinks;
32 
33     // Get/Set Strategy
34     public IBillingStrategy Strategy { get; set; }
35 
36     public Customer(IBillingStrategy strategy)
37     {
38         this.drinks = new List<double>();
39         this.Strategy = strategy;
40     }
41 
42     public void Add(double price, int quantity)
43     {
44         drinks.Add(Strategy.GetActPrice(price * quantity));
45     }
46 
47     // Payment of bill
48     public void PrintBill()
49     {
50         double sum = 0;
51         foreach (double i in drinks)
52         {
53             sum += i;
54         }
55         Console.WriteLine("Total due: " + sum);
56         drinks.Clear();
57     }
58 }
59 
60 interface IBillingStrategy
61 {
62     double GetActPrice(double rawPrice);
63 }
64 
65 // Normal billing strategy (unchanged price)
66 class NormalStrategy : IBillingStrategy
67 {
68     public double GetActPrice(double rawPrice)
69     {
70         return rawPrice;
71     }
72 
73 }
74 
75 // Strategy for Happy hour (50% discount)
76 class HappyHourStrategy : IBillingStrategy
77 {
78 
79     public double GetActPrice(double rawPrice)
80     {
81         return rawPrice * 0.5;
82     }
83 }

각주[편집]

  1. Eric Freeman, Elisabeth Freeman, Kathy Sierra and Bert Bates, Head First Design Patterns, First Edition, Chapter 1, Page 24, O'Reilly Media, Inc, 2004. ISBN 978-0-596-00712-6
  2. Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides (1994). 《Design Patterns: Elements of Reusable Object-Oriented Software》. Addison Wesley. 315ff쪽. ISBN 0-201-63361-2. 
  3. “The Strategy design pattern - Structure and Collaboration”. 《w3sDesign.com》. 2017년 8월 12일에 확인함.