> Java > java지도 시간 > 본문

더 이상 if-else 블록을 사용하지 마세요! 전략과 팩토리 패턴을 함께 사용

Mary-Kate Olsen
풀어 주다: 2024-10-19 06:08:31
원래의
619명이 탐색했습니다.

Don’t use if-else blocks anymore! Use Strategy and Factory Pattern Together

if-else 블록에 빠져 복잡한 조건과 반복적인 코드로 어려움을 겪는 프로젝트를 진행하면서 우리는 해결책을 찾습니다. 그런데 왜 우리는 if-else 블록에 갇혀 있어야 할까요? 이번 글에서는 전략 패턴과 팩토리 패턴을 함께 사용하여 if-else 혼동을 없애는 방법을 찾아보겠습니다.

문제: If-Else 혼동

전자상거래 애플리케이션을 개발 중이고 신용카드, 직불카드, 암호화폐 등 다양한 결제 방법을 지원해야 한다고 가정해 보겠습니다. if-else 블록으로 시작하여 결제를 처리합니다.

public class PaymentService {

    public void processPayment(String paymentType) {
        if (paymentType.equals("CREDIT_CARD")) {
            System.out.println("Processing credit card payment...");
        } else if (paymentType.equals("DEBIT_CARD")) {
            System.out.println("Processing debit card payment...");
        } else if (paymentType.equals("CRYPTO")) {
            System.out.println("Processing crypto payment...");
        } else {
            throw new IllegalArgumentException("Invalid payment type");
        }
    }
}
로그인 후 복사

처음에는 간단해 보일 수 있지만 결제 방법이 증가할수록 if-else도 복잡해집니다. 새로운 결제 방법은 새로운 조건을 추가하는 것을 의미합니다. 그 결과 관리하기 어려운 코드 더미가 탄생했습니다. 그리고 이 방법은 개방-폐쇄 원칙에 위배됩니다.

하지만 전략 패턴과 팩토리 패턴을 모두 사용하여 이 문제를 해결할 수 있습니다.

먼저 열거형을 만들어 보겠습니다.

public enum PaymentType {
    CREDIT_CARD,
    DEBIT_CARD,
    CRYPTO
}
로그인 후 복사

해결책: 전략 패턴으로 정리

public interface PaymentStrategy {
    void pay(PaymentRequest request);
}

public class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(PaymentRequest request) {
        System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
    }
}

public class DebitCardPayment implements PaymentStrategy {
    @Override
    public void pay(PaymentRequest request) {
        System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
    }
}

public class CryptoPayment implements PaymentStrategy {
    @Override
    public void pay(PaymentRequest request) {
        System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
    }
}
로그인 후 복사

이 단계에서는 공통 인터페이스에서 각 결제 방법에 대한 별도의 전략이 구현됩니다. 이제 Factory Pattern을 통해 어떤 전략을 선택할지 결정해보겠습니다.

2단계: 팩토리 패턴을 사용한 전략 선택

이 단계에서는 EnumMap을 사용하여 Factory Pattern을 더욱 깔끔하고 최적화할 수 있습니다.

public class PaymentFactory {
    private static final Map<PaymentType, PaymentStrategy> strategies = new EnumMap<>(PaymentType.class);

    static {
        strategies.put(PaymentType.CREDIT_CARD, new CreditCardPayment());
        strategies.put(PaymentType.DEBIT_CARD, new DebitCardPayment());
        strategies.put(PaymentType.CRYPTO, new CryptoPayment());
    }

    public static PaymentStrategy getPaymentStrategy(PaymentType paymentType) {
        PaymentStrategy strategy = strategies.get(paymentType);

        if (Objects.isNull(strategy))
            throw new IllegalArgumentException("Strategy not found");

        return strategy;
    }
}
로그인 후 복사

마지막 단계: 서비스 클래스 재구성

이제 우리가 수행한 작업을 사용해 보겠습니다.

public class PaymentService {

    public void processPayment(PaymentRequest request) {
        // Don't forget to check objects if null!
        if (Objects.isNull(request) || Objects.isNull(request.getPaymentType())
            throw new IllegalArgumentException("Request can not be null!");
        PaymentStrategy strategy = PaymentFactory.getPaymentStrategy(request.getPaymentType());

        strategy.pay(request);
    }
}
로그인 후 복사

현재로서는 결제 처리에 if-else 블록이 필요하지 않습니다. Strategy와 Factory Patterns 덕분에 우리의 코드는 더욱 깔끔하고 모듈화되었으며 확장 가능합니다.

왜 이 패턴을 사용해야 할까요?

1. 확장성: 새 결제 방법을 추가하려면 새 클래스와 몇 줄의 코드만 필요합니다.
2. 가독성: if-else 블록 대신 전략과 팩토리를 사용하면 코드를 더 이해하기 쉽고 관리하기 쉽게 만들 수 있습니다.
3. 유지 관리성: 전략 및 팩토리 패턴을 사용하면 다른 코드 부분에 영향을 주지 않고 코드를 변경할 수 있습니다.

결론: 혼란에서 명확함으로

성장하는 프로젝트를 진행 중이라면 if-else 블록을 사용하면 안 됩니다. 전략 및 팩토리 패턴은 코드를 더 깔끔하고, 모듈식이며, 유지 관리 가능하게 만드는 완벽한 솔루션입니다.

이 기사에서 볼 수 있듯이 if-else 블록 대신 디자인 패턴을 사용하여 결제 거래를 관리하면 프로젝트 개발이 더 쉬워지고 코드 가독성이 향상됩니다. if-else 블록을 사용하는 대신 다음 프로젝트에서 이러한 패턴을 사용해 보세요.

...

제 글을 읽어주셔서 감사합니다! 질문이나 피드백, 공유하고 싶은 생각이 있으시면 댓글로 듣고 싶습니다.

이 주제와 내 다른 게시물에 대한 자세한 내용을 보려면 dev.to에서 나를 팔로우하세요.

고마워요!?‍??

Linkedin에서 저를 팔로우하려면: https://www.linkedin.com/in/tamerardal/
중간: 더 이상 if-else 블록을 사용하지 마세요! 전략과 팩토리 패턴을 함께 사용하세요

위 내용은 더 이상 if-else 블록을 사용하지 마세요! 전략과 팩토리 패턴을 함께 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!