전략패턴

DEV_HOYA·2023년 10월 19일
0

CS

목록 보기
16/55
post-thumbnail
post-custom-banner

📌 전략패턴

⭐ 개념

  • 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법
  • 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴

⭐ 코드

public class Main{
	public static void main(String []args){
		ShoppingCart cart = new ShoppingCart();
		Item americano = new Item("Americano",2000);
		Item kiwijuice = new Item("KiwiJuice",3000);
		cart.addItem(americano);
		cart.addItem(kiwijuice);
        
        // 전략적으로 네이버페이, 카카오페이를 사용할 수 있다.
        // 매개변수 내용이 달라도 가능하다.
		cart.pay(new NaverPayStrategy("tubus1130@gmail.com", "1234"));
		cart.pay(new KakaoPayStrategy("123-456-7890", "1234", "23/10/19"));
	}
}
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);
	}
}
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;
	}
}
interface PaymentStrategy {
	public void pay(int amount);
}
class KakaoPayStrategy implements PaymentStrategy {
	private String cardNumber;
	private String cvv;
	private String expiryDate;
	public KakaoPayStrategy(String ccNum, String cvv, String expiryDate){
		this.cardNumber=ccNum;
		this.cvv=cvv;
		this.expiryDate=expiryDate;
	}
	@Override
	public void pay(int amount) {
		System.out.println(amount +"원이 KakaoPay로 결제되었습니다.");
	}
}
class NaverPayStrategy implements PaymentStrategy {
	private String emailId;
	private String password;
	public NaverPayStrategy(String email, String pwd){
		this.emailId=email;
		this.password=pwd;
	}
	@Override
	public void pay(int amount) {
		System.out.println(amount + "원이 NaverPay로 결제되었습니다.");
	}
}
// 5000원이 NaverPay로 결제되었습니다.
// 5000원이 KakaoPay로 결제되었습니다.
post-custom-banner

0개의 댓글