Home > Backend > CS > ๐Ÿ’พ [CS] ์ „๋žต ํŒจํ„ด(Strategy pattern)

๐Ÿ’พ [CS] ์ „๋žต ํŒจํ„ด(Strategy pattern)
CS

๐Ÿ’พ [CS] ์ „๋žต ํŒจํ„ด(Strategy pattern)

1๏ธโƒฃ ์ „๋žต ํŒจํ„ด(Strategy pattern)

  • ์ „๋žต ํŒจํ„ด(Strategy pattern) ์€ ์ •์ฑ… ํŒจํ„ด(Policy pattern) ์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ๊ฐ์ฑ„์˜ ํ–‰์œ„๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ โ€˜์ง์ ‘โ€™ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ „๋žต์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” โ€˜์บก์Šํ™”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜โ€™ ์„ ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ๋ฐ”๊ฟ”์ฃผ๋ฉด์„œ ์ƒํ˜ธ ๊ต์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • ์•„๋ž˜์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ๊ฒƒ์„ ์‚ด ๋•Œ ๋„ค์ด๋ฒ„ํŽ˜์ด, ์นด์นด์˜คํŽ˜์ด ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฒฐ์ œํ•˜๋“ฏ์ด ์–ด๋–ค ์•„์ดํ…œ์„ ์‚ด ๋•Œ LUNACard๋กœ ์‚ฌ๋Š” ๊ฒƒ๊ณผ KAKAOCard๋กœ ์‚ฌ๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
    • ๊ฒฐ์ œ ๋ฐฉ์‹์˜ โ€˜์ „๋žตโ€™ ๋งŒ ๋ฐ”๊ฟ”์„œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ฒฐ์ œํ•˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
// PaymentStrategy - interface

public interface PaymentStrategy {
	void pay(int amount);
}

// KAKAOCardStrategy

public class KAKAOCardStrategy implements PaymentStrategy{
	private String name;
	private String cardNumber;
	private String cvv;
	private String dateOfExpiry;

	public KAKAOCardStrategy(String name, String cardNumber, String cvv, String dateOfExpiry) {
		this.name = name;
		this.cardNumber = cardNumber;
		this.cvv = cvv;
		this.dateOfExpiry = dateOfExpiry;
	}

	@Override
	public void pay(int amount) {
		System.out.println(amount + " paid using KAKAOCard.");
	}
}

// LUNACardStrategy

public class LUNACardStrategy implements PaymentStrategy {
	private String emailId;
	private String password;

	public LUNACardStrategy(String emailId, String password) {
		this.emailId = emailId;
		this.password = password;
	}

	@Override
	public void pay(int amount) {
		System.out.println(amount + " paid using LUNACard");
	}
}

// Item

public class Item {
	private String name;
	private int price;
	public Item(String name, int price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public int getPrice() {
		return price;
	}
}

// ShoppingCart

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {
	List<Item> 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 pamentMethod) {
		int amount = calculateTotal();
		pamentMethod.pay(amount);
	}
}

// Main

import designPattern.strategy.Item;
import designPattern.strategy.KAKAOCardStrategy;
import designPattern.strategy.LUNACardStrategy;
import designPattern.strategy.ShoppingCart;

public class Main {

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

		Item A = new Item("A", 100);
		Item B = new Item("B", 300);

		cart.addItem(A);
		cart.addItem(B);

		// pay by LUNACard
		cart.pay(new LUNACardStrategy("kobe@google.com", "1234"));

		// pay by KAKAOCard
		cart.pay(new KAKAOCardStrategy("Minseong Kang", "123456789", "123", "12/01"));
	}
}

์‹คํ–‰ ๊ฒฐ๊ณผ

400 paid using LUNACard
400 paid using KAKAOCard.
  • ์œ„ ์ฝ”๋“œ๋Š” ์‡ผํ•‘ ์นด๋“œ์— ์•„์ดํ…œ์„ ๋‹ด์•„ LUNACard ๋˜๋Š” KAKAOCard ๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ „๋žต์œผ๋กœ ๊ฒฐ์ œํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์šฉ์–ด : ์ปจํ…์ŠคํŠธ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ์ปจํ…์ŠคํŠธ๋Š” ์ƒํ™ฉ, ๋งฅ๋ฝ, ๋ฌธ๋งฅ์„ ์˜๋ฏธํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋– ํ•œ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.