-
[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
1234567package strategy;public interface PaymentStrategy {public void pay(int amount);}cs CreditCardStrategy.java
123456789101112131415161718192021222324package 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
12345678910111213141516171819package 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
123456789101112131415161718192021222324252627282930package 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
12345678910111213141516171819202122232425262728293031323334353637package 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
12345678910111213141516171819package 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 'CSE > Design Pattern' 카테고리의 다른 글
[Design Pattern] 메멘토(Memento) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 커멘드(Command) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 상태(State) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 옵저버(Observer) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 중재자(Mediator) 패턴 - 디자인 패턴 (0) 2015.06.13 [Design Pattern] 반복자(Iterator) 패턴 - 디자인 패턴 (0) 2015.06.13