ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 전략(Strategy) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:55

    Pattern #20  전략 패턴




     장단점이 서로 다른 여러 알고리즘들이 존재하는 상황에서 최적의 알고리즘을 선택해서 사용할 때




     패턴 요약 

      - 알고리즘들을 객체로 만들고 일반화

      - Client가 알 필요가 없거나, 알아서는 안 되는 자료를 알고리즘에 사용할 때



     

     동기

      

     당신이 이번에 맡은 일은 보안 시스템을 개발하는 작업이다. 보안 시스템의 핵심으로 암호화 알고리즘이 사용된다. 시스템을 설계할 때 고려해야 될 사항으로는 각 인증기관에 따라 서로 다른 암호화 알고리즘을 사용해야 되며, 또 기술의 발전에 따라 알고리즘을 교체하여야 한다는데 있다. 어떻게 설계할 것인가?

     

     










     기본적인 방법










     기본적인 방법

      - 알고리즘들을 객체로 만들고 일반화 한다.
         * 알고리즘 사용 객체와 알고리즘 객체와의 결합이 줄어든다.  
         * 기존 코드 수정 없이, subclassing을 통하여 새로운 알고리즘을 추가할 수 있다.








     의도

      - 동일한 용도로 사용되는 알고리즘들을 객체로 만들어 서로 교체 할 수 있도록 한다. Strategy는 알고리즘 사용객체와 독립적으로 알고리즘을 변경시킬 수 있음.

     별명

      - Policy









     적용범위

      - 많은 연관된 클래스들이 단지 행위(behavior)만 서로 다를 때, Strategy 패턴을 사용함으로써 하나의 클래스에 적절한 행위를 설정할 수 있다.
       - 장단점이 서로 다른 여러 알고리즘들이 존재하는 상황에서 최적의 알고리즘을 선택해서 사용할 때 유용하다.

     결과

      - 관련된 알고리즘의 패밀리
        * Strategy 클래스 구조는 Context 객체가 사용할 알고리즘 패밀리를 정의한다.
       - subclassing 이외의 다른 방법
        *  다른 알고리즘을 사용하기 위하여 Context 객체를 subclassing할 수 있다. 그러나, 이 경우 각 행위가 특정 sub-class와 묶여지기 때문에 이해하거나 확장 및 관리하기 힘들어진다.
       - 조건문을 제거






    예제.




    PaymentStrategy.java

     

    1
    2
    3
    4
    5
    6
    7
    package strategy;
     
    public interface PaymentStrategy {
        public void pay(int amount);
    }
     
     
    cs





    CreditCardStrategy.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    package strategy;
     
    public class CreditCardStrategy implements PaymentStrategy {
     
        private String name;
        private String cardNumber;
        private String cvv;
        private String dateOfExpiry;
     
        public CreditCardStrategy(String name, String cardNumber, String cvv,
                String dateOfExpiry) {
            this.name = name;
            this.cardNumber = cardNumber;
            this.cvv = cvv;
            this.dateOfExpiry = dateOfExpiry;
        }
     
        public void pay(int amount) {
            System.out.println(amount + " paid with credit/debit card");
        }
     
    }
     
    cs





    PaypalStrategy.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package strategy;
     
    public class PaypalStrategy implements PaymentStrategy {
     
        private String emailId;
        private String password;
     
        public PaypalStrategy(String email, String password) {
            this.emailId = email;
            this.password = password;
        }
     
        public void pay(int amount) {
            System.out.println(amount + " paid using Paypal.");
        }
     
    }
     
    cs





    Item.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    package strategy;
     
    public class Item {
        private String upcCode;
        private int price;
     
        public Item(String upcCode, int price) {
            this.upcCode = upcCode;
            this.price = price;
        }
     
        public String getUpcCode() {
            return upcCode;
        }
     
        public void setUpcCode(String upcCode) {
            this.upcCode = upcCode;
        }
     
        public int getPrice() {
            return price;
        }
     
        public void setPrice(int price) {
            this.price = price;
        }
     
    }
     
    cs




    ShoppingCart.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    package strategy;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class ShoppingCart {
        List<Item> items;
     
        public ShoppingCart() {
            this.items = new ArrayList<Item>();
        }
     
        public void addItem(Item item) {
            this.items.add(item);
        }
     
        public void removeItem(Item item) {
            this.items.remove(item);
        }
     
        public int calculateTotal() {
            int sum = 0;
     
            for (Item item : items) {
                sum += item.getPrice();
            }
     
            return sum;
        }
     
        public void pay(PaymentStrategy paymentMethod) {
            int amount = calculateTotal();
            paymentMethod.pay(amount);
        }
    }
     
    cs





    StrategyMain.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    package strategy;
     
    public class StrategyMain {
        public static void main(String args[]) {
            ShoppingCart cart = new ShoppingCart();
     
            Item item1 = new Item("1234"10);
            Item item2 = new Item("5678"40);
     
            cart.addItem(item1);
            cart.addItem(item2);
     
            cart.pay(new PaypalStrategy("myemail@exam.com""mypwd"));
     
            cart.pay(new CreditCardStrategy("myName""111333""33432""04/17"));
        }
    }
     
    cs








    댓글

Designed by Tistory.