"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Java의 전략 디자인 패턴 이해

Java의 전략 디자인 패턴 이해

2024-08-21에 게시됨
검색:731

Understanding the Strategy Design Pattern in Java

Java의 전략 디자인 패턴 이해

문제

전략 패턴은 알고리즘 계열을 정의하고 각 알고리즘을 캡슐화하며 상호 교환 가능하게 만드는 필요성을 해결합니다. 이 패턴을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘이 달라질 수 있습니다. 특정 작업을 수행하는 방법이 다양하고 런타임에 알고리즘을 선택하려는 경우에 유용합니다.

해결책

전략 패턴에는 세 가지 주요 구성 요소가 포함됩니다.

  1. 컨텍스트: 전략 개체에 대한 참조를 포함하고 이를 사용하여 알고리즘을 실행하는 개체입니다.
  2. 전략: 지원되는 모든 알고리즘에 공통적인 인터페이스입니다. 컨텍스트는 이 인터페이스를 사용하여 구체적인 전략에 의해 정의된 알고리즘을 호출합니다.
  3. 구체적인 전략: 특정 알고리즘을 제공하는 전략 인터페이스를 구현하는 클래스입니다.

컨텍스트는 알고리즘 실행을 전략 개체에 위임하여 런타임 시 알고리즘을 선택할 수 있도록 합니다.

장점과 단점

장점

  • 알고리즘 캡슐화: 각 알고리즘은 자체 클래스에 캡슐화되므로 컨텍스트를 변경하지 않고도 알고리즘 간 전환이 쉽고 새 알고리즘을 추가할 수 있습니다.
  • 단일 책임 원칙: 컨텍스트 클래스는 알고리즘 구현을 전략 클래스에 위임하므로 단순화됩니다.
  • 개방/폐쇄 원칙: 기존 컨텍스트나 전략 클래스를 변경하지 않고 새로운 전략을 도입할 수 있습니다.

단점

  • 클래스 수 증가: 패턴은 각 알고리즘에 대한 새로운 전략 클래스 생성으로 인해 코드베이스의 클래스 수를 늘립니다.
  • 전환 전략의 복잡성: 잘 관리되지 않으면 런타임에 전략을 동적으로 전환하면 복잡성과 잠재적인 오류가 발생할 수 있습니다.

실제 적용 사례

전략 패턴의 실제 예는 다양한 결제 방법(예: 신용 카드, PayPal, 은행 송금)이 다양한 전략으로 구현되는 결제 처리 시스템에 있습니다. 클라이언트는 런타임 시 적절한 결제 전략을 선택할 수 있습니다.

Java의 예제 코드

코드의 전략 패턴:

java
// Strategy Interface
public interface PaymentStrategy {
    void pay(int amount);
}

// Concrete Strategy 1
public class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;

    public CreditCardPayment(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount   " paid with credit card "   cardNumber);
    }
}

// Concrete Strategy 2
public class PayPalPayment implements PaymentStrategy {
    private String email;

    public PayPalPayment(String email) {
        this.email = email;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount   " paid using PayPal account "   email);
    }
}

// Context
public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) {
        paymentStrategy.pay(amount);
    }
}

// Client code
public class Client {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432"));
        cart.checkout(100);

        cart.setPaymentStrategy(new PayPalPayment("[email protected]"));
        cart.checkout(200);
    }
}
릴리스 선언문 이 글은 https://dev.to/diegosilva13/understanding-the-strategy-design-pattern-in-java-3ah4?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3