Java의 전략 디자인 패턴 – 예제 튜토리얼

전략 디자인 패턴은 행동 디자인 패턴 중 하나입니다. 전략 패턴은 특정 작업에 대해 여러 알고리즘이 있는 경우에 사용되며, 클라이언트가 런타임에 사용할 실제 구현을 결정합니다.

전략 패턴

전략 패턴은 정책 패턴으로도 알려져 있습니다. 우리는 여러 알고리즘을 정의하고, 클라이언트 애플리케이션이 사용할 알고리즘을 매개변수로 전달하도록 합니다. 전략 패턴의 가장 좋은 예는 Collections.sort() 메소드입니다. 이 메소드는 Comparator 매개변수를 받습니다. Comparator 인터페이스의 다른 구현에 따라 객체가 다른 방식으로 정렬됩니다. 이 예제에서는 심플한 쇼핑 카트를 구현해보겠습니다. 두 가지 결제 전략인 신용카드 사용과 PayPal 사용이 있습니다. 먼저, 결제 금액을 전달하는 인터페이스를 만들겠습니다. PaymentStrategy.java

package com.journaldev.design.strategy;

public interface PaymentStrategy {

	public void pay(int amount);
}

이제 신용카드 또는 PayPal을 사용한 결제를 위한 알고리즘의 구체적인 구현을 만들어야 합니다. CreditCardStrategy.java

package com.journaldev.design.strategy;

public class CreditCardStrategy implements PaymentStrategy {

	private String name;
	private String cardNumber;
	private String cvv;
	private String dateOfExpiry;
	
	public CreditCardStrategy(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 with credit/debit card");
	}

}

PaypalStrategy.java

package com.journaldev.design.strategy;

public class PaypalStrategy implements PaymentStrategy {

	private String emailId;
	private String password;
	
	public PaypalStrategy(String email, String pwd){
		this.emailId=email;
		this.password=pwd;
	}
	
	@Override
	public void pay(int amount) {
		System.out.println(amount + " paid using Paypal.");
	}

}

이제 전략 패턴 예제 알고리즘이 준비되었습니다. 쇼핑 카트를 구현하고 결제 방법은 결제 전략을 입력으로 필요로 할 것입니다. Item.java

package com.journaldev.design.strategy;

public class Item {

	private String upcCode;
	private int price;
	
	public Item(String upc, int cost){
		this.upcCode=upc;
		this.price=cost;
	}

	public String getUpcCode() {
		return upcCode;
	}

	public int getPrice() {
		return price;
	}
	
}

ShoppingCart.java

package com.journaldev.design.strategy;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {

	//항목 목록
	List items;
	
	public ShoppingCart(){
		this.items=new ArrayList();
	}
	
	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);
	}
}

주목할 점은 쇼핑 카트의 결제 방법이 결제 알고리즘을 인수로 사용하며 인스턴스 변수로 어디에도 저장하지 않는다는 것입니다. 간단한 프로그램으로 전략 패턴 예제 설정을 테스트해 봅시다. ShoppingCartTest.java

package com.journaldev.design.strategy;

public class ShoppingCartTest {

	public static void main(String[] args) {
		ShoppingCart cart = new ShoppingCart();
		
		Item item1 = new Item("1234",10);
		Item item2 = new Item("5678",40);
		
		cart.addItem(item1);
		cart.addItem(item2);
		
		//페이팔로 지불
		cart.pay(new PaypalStrategy("[email protected]", "mypwd"));
		
		//신용 카드로 지불
		cart.pay(new CreditCardStrategy("Pankaj Kumar", "1234567890123456", "786", "12/15"));
	}

}

위 프로그램의 출력은 다음과 같습니다:

50 paid using Paypal.
50 paid with credit/debit card

전략 디자인 패턴 클래스 다이어그램

전략 디자인 패턴 중요 포인트

  • 전략을 생성하기 위해 구성을 사용할 수 있었지만 특정 작업에 대해 특정 전략을 적용하려면 피해야 합니다. 이는 Collections.sort() 및 Arrays.sort() 메서드에서 comparator를 인수로 사용하는 것과 동일합니다.
  • 전략 패턴은 상태 패턴과 매우 유사합니다. 차이 중 하나는 Context가 상태를 인스턴스 변수로 포함하고 상태에 따라 구현이 의존하는 여러 작업이 있을 수 있다는 것입니다. 반면에 전략 패턴에서는 전략이 메서드에 인수로 전달되고 context 객체에 저장할 변수가 없습니다.
  • 전략 패턴은 특정 작업에 대해 여러 알고리즘이 있고 애플리케이션이 특정 작업에 대해 런타임에서 어떤 알고리즘을 선택할 수 있도록 유연하게 하기 위해 유용합니다.

자바에서의 전략 패턴에 대한 설명은 여기까지 입니다. 마음에 드셨으면 좋겠습니다.

Source:
https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial