전략 패턴(Strategy)
전략 패턴은 팩토리 패턴과 굉장히 유사하다. 다른점이 있다면, 지금 하는 행동을 다른 행동으로 바꿀 수 있다는 것이다. 이는 자바 Runtime
에 결정된다.
팩토리 패턴과 상위 클래스를 하위 클래스가 상속 받는 방식이 유사하기 때문에 장점, 단점, 해결책 내용은 넘어간다.
간단히 구현 부분만 집고 넘어가겠다.
구현
먼저 interface로 구현한다.
// 전략 패턴
interface PaymentStrategy {
public void pay(int amount);
}
어떤 상품을 구매할 때, KAKAOCard
로 사는 것과, LUNACard
로 사는 것을 구현다.
class KAKAOCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public KAKAOCardStrategy(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 KAKAOCard.");
}
}
class LUNACardStrategy implements PaymentStrategy {
private String emailId;
private String password;
public LUNACardStrategy(String email, String pwd) {
this.emailId = email;
this.password = pwd;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using LUNACard.");
}
}
이후 아이템과 장바구니를 만들어 주는 클래스를 구현한다.
class Item {
private String name;
private int price;
public 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 calculateTotal() {
int sum = 0;
for (Item item : items) {
sum += item.getPrice();
}
return sum;
}
public void pay(PaymentStrategy paymentMethod) {
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
마지막으로 테스트 코드를 만든다. 카드사 마다 속성이 달라, 파라미터를 다르게 받는다. 즉, 속성변수 갯수가 다르다.
또한 각 카드사에 pay()
를 각각 구현해줌으로써 전략 패턴
이라고 볼 수 있다.
public class HelloWorld {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item A = new Item("kundolA", 100);
Item B = new Item("kundolB", 300);
cart.addItem(A);
cart.addItem(B);
// pay by LUNACard
cart.pay(new LUNACardStrategy("kundol@example.com","pukubababo"));
// pay by KAKAOCard
cart.pay(new KAKAOCardStrategy("Ju hongchul", "123456789","123","12/01"));
}
}
Referance
참고 자료
CS전공지식노트
반응형
'Language > Java' 카테고리의 다른 글
프로그래밍 패러다임 - Java, JavaScript (0) | 2023.06.07 |
---|---|
디자인 패턴 & 패러다임 모음 - Java (0) | 2023.05.30 |
옵저버 패턴(Observer) - Java (2) | 2023.05.30 |
팩토리 패턴(Factory) - Java (0) | 2023.05.30 |
싱글톤 패턴(Singleton) 및 7가지 구현 - Java (2) | 2023.05.30 |