이카's
article thumbnail
Published 2023. 5. 30. 04:34
전략 패턴(Strategy) - Java Language/Java

전략 패턴(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전공지식노트

반응형
profile

이카's

@Edan Cafe ☕

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!