[CS정리] 디자인 패턴 - 전략 패턴(Strategy Pattern)

10000DOO·2023년 7월 3일
1

CS정리

목록 보기
3/3

🔶전략 패턴(Strategy Pattern)

🔹정의

객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴

-컨텍스트- 프로그래밍에서의 컨텍스트는 상황, 맥락, 문맥을 의미하며 개발자가 어떠한 작업을 완료하는 데 필요한 모든 관련 정보를 말한다.

어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘
ex) 게임 프로그래밍에서 게임 캐릭터가 자신이 처한 상황에 따라 공격이나 행동하는 방식을 바꾸고 싶을 때

🔹구현 예시

상황에 따라 간단하게 결제 방식을 변경할 수 있게 구현할 수 있습니다.

interface PaymentStrategy { 
    public void pay(int amount);
}
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);
    }
}  
public class Main{
    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 KAKAOBank
        cart.pay(new KAKAOCardStrategy("Ju hongchul", "123456789", "123", "12/01"));
    }
}

🔹장점

알고리즘 교체 용이성: Strategy Pattern을 사용하면, 실행 중에 다른 알고리즘으로 쉽게 전환할 수 있습니다. 이렇게 함으로써 클라이언트 코드는 변경되지 않고 전략만 교체하여 기능을 변경할 수 있습니다.

코드 재사용성: 알고리즘을 개별 전략 클래스로 분리하여 구현하면 다른 문제에 대해서도 해당 전략을 재사용할 수 있습니다. 이는 유지 보수가 용이하게 만들어줍니다.

유연성: 동적으로 알고리즘을 변경할수있으며, 새로운 알고리즘이 필요한 경우 전략 클래스를 추가하면 되므로 유연성이 향상됩니다.

결합도 감소: Strategy Pattern은 알고리즘의 사용과 구현 사이의 의존성을 낮춰 주연 결합화를 줄입니다. 이는 소프트웨어 아키텍처에 도움이 되며, 쉽게 변경돼야 하는 행동을 분리합니다.

🔹단점

객체 수 증가: 다양한 전략을 사용하고자 하는 경우, 각각의 전략에 대한 객체를 생성해야 합니다. 이로 인해 객체 수가 증가하며 메모리와 성능에 영향을 줄 수 있습니다.

코드 복잡성: 전략 패턴을 코드에 도입하면 구조가 복잡해질 수 있습니다. 클라이언트는 전략을 활용하기 위해 전략 객체를 초기화하고 적용해야 할 수 있기 때문입니다.

초기 학습 곡선: Strategy Pattern의 이해와 사용에는 초기 학습 곡선이 있습니다. 개발자들은 전략 패턴을 이해하고 효율적으로 사용하는 데 시간이 필요할 수 있습니다.

📚참고 자료

https://inpa.tistory.com/entry/GOF-💠-전략Strategy-패턴-제대로-배워보자#전략_패턴_사용_시기

profile
iOS 개발자 지망생 https://github.com/10000DOO

0개의 댓글