ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인 패턴] 전략 패턴 (Strategy Pattern)
    Computer Science/Design Pattern 2022. 12. 13. 14:09
    반응형

    전략패턴이란?

    : 실행 중에 알고리즘을 선택할 수 있게 하는 행위(Behavioral) 소프트웨어 디자인 패턴
    - 특정한 계열의 알고리즘을 정의하고 각각 캡슐화하며 해당 계열내에서 상호 교체가 가능하게 함
    - 어떤 동작을 하는 로직을 정의하고, 이것을 캡슐화하여 관리하는 패턴
    (ex. 결제할 때 네이버페이, 카카오페이 등 '전략'만 바꿔서 결제가 가능하게 함)
    - 독립적으로 알고리즘을 다양하게 변경할 수 있으며 기능 추가, 로직 변경시 유연하게 확장 가능
    - 어떤 전략을 사용할지 외부에서 데이터 입력이 필요
    - 클래스를 수정하지 않고도 기능을 추가하거나 변경할 수 있음

    [ 구현 방법 ] 

    // 결제 전략 인터페이스
    interface PaymentStartegy {
      public void pay(int amount);
    }
    
    // 1. 카카오페이를 통한 결제
    class KakaoPay implements PaymentStrategy {
      private String name;
      private String cardNumber;
      private String cvv;
      private String dateOfExpiry;
      
      public KakaoPay(String nm, String ccNum, String cvv, String expiryDate) {
        this.name = nm;
        this.cardNumber = ccNum;
        this.cvv = cvv;
        this.dateOfExpiry = expiryDate;
      }
      
      @Override
      public void pay(int amount) {
        System.out.println(amount + " paid using KaKao.");
      }
    }
    
    // 2. 네이버페이를 통한 결제
    class NaverPay implements PaymentStrategy {
      private String emailId;
      private String password;
      
      public NaverPay(String email, String pwd) {
        this.emaildId = email;
        this.password = pwd;
      }
      
      @Override
      public void pay(int amount) {
        System.out.println(amount + " paid using Naver.");
      }
    }
      
    // 구매 물건 정보를 저장할 클래스
    class Item {
      private String name;
      private int price;
      
      private Item(String name, int cost) {
        this.name = name;
        this.price = cost;
      }
      
      public String getName() {
        return name;
      }
      
      public int getPrice() {
        return price;
      }
    }
    
    // 구매 물건들을 담고 있을 쇼핑카트 클래스
    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 caculateTotal() {
        int sum = 0;
       	for (Item item : items) {
          sum += item.getPrice();
        }
        return sum;
      }
      
      public void pay(PaymentStrategy paymentMethod) {
        int amount = calculateTotal();
        paymentMethod.pay(amount);
      }
    }
    
    public class Test {
      public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
         
        Item A = new Item("orange", 300);
        Item B = new Item("pizza", 1000);
        
        cart.pay(new NaverPay("erin@naver.com", "hello"));
      }
    }
    
    /*
    1300 paid using NaverPay
    */

     

    반응형

    댓글

Designed by Tistory.