
์ ๋ต ํจํด(Strategy Pattern)์ ๊ฐ์ฒด์ ํ๋(์๊ณ ๋ฆฌ์ฆ)์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ๋์์ธ ํจํด์ ๋๋ค.
์ฝ๊ฒ ๋งํด, ์ด๋ค ๋์(์ ๋ต)์ด ํ์ํ ๋ ์ง์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ , ์ ๋ต์ ๊ต์ฒดํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ ํจํด์ ๋๋ค.
์๋ฅผ ๋ค์ด, ํผ์ ๊ฐ๊ฒ์์ ๋ฐฐ๋ฌ ๋ฐฉ์์ด ์ฌ๋ฌ ๊ฐ์ง ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๐
๋ง์ฝ ์๋ก์ด ๋ฐฐ๋ฌ ๋ฐฉ์์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด ๋ถํธํ๊ฒ ์ง์? ๐คฏ
์ ๋ต ํจํด์ ์ฌ์ฉํ๋ฉด ๋ฐฐ๋ฌ ๋ฐฉ์(์ ๋ต)์ ๋ฐ๋ก ๋ถ๋ฆฌํด ๋๊ณ , ํ์ํ ๋๋ง๋ค ๋ค๋ฅธ ์ ๋ต์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ ๋ต ํจํด์๋ ์ธ ๊ฐ์ง ํต์ฌ ์์๊ฐ ์์ต๋๋ค.
1๏ธโฃ Context(๋ฌธ๋งฅ) โ ์ ๋ต์ ์คํํ๋ ์ญํ (ํผ์ ์ฃผ๋ฌธ ์์คํ
๐)
2๏ธโฃ Strategy(์ ๋ต) ์ธํฐํ์ด์ค โ ์คํ๋ ์ ๋ต์ ์ ์ (๋ฐฐ๋ฌ ๋ฐฉ์ ๐ต)
3๏ธโฃ Concrete Strategy(๊ตฌ์ฒด์ ์ธ ์ ๋ต) โ ์ค์ ๋ก ๋์ํ๋ ์ ๋ต ๊ตฌํ์ฒด๋ค (์: ๋ฐฐ๋ฌ์ ๋ฐฐ๋ฌ, ๋๋ก ๋ฐฐ๋ฌ, ๋งค์ฅ ํฝ์
๐ฏ)
์ด์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ดํดํด ๋ณด๊ฒ ์ต๋๋ค. ๐
// ๋ฐฐ๋ฌ ์ ๋ต์ ์ ์ํ๋ ์ธํฐํ์ด์ค
public interface DeliveryStrategy {
void deliver(String order);
}
์ด๋ ๋ฐฉ์(์ ๋ต)์ ์ ๋ฆฌํด ๋์ DeliveryStrategy ์ธํฐํ์ด์ค์
๋๋ค.
์ด์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ๋ฐฐ๋ฌ ์ ๋ต์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
// ๋ฐฐ๋ฌ์์ด ์ง์ ๋ฐฐ๋ฌํ๋ ์ ๋ต
public class BikeDelivery implements DeliveryStrategy {
@Override
public void deliver(String order) {
System.out.println("๐ฒ ๋ฐฐ๋ฌ์์ด " + order + "๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค!");
}
}
// ๋๋ก ์ด ๋ฐฐ๋ฌํ๋ ์ ๋ต
public class DroneDelivery implements DeliveryStrategy {
@Override
public void deliver(String order) {
System.out.println("๐ ๋๋ก ์ด " + order + "๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค!");
}
}
// ๋งค์ฅ์์ ์ง์ ํฝ์
ํ๋ ์ ๋ต
public class PickupDelivery implements DeliveryStrategy {
@Override
public void deliver(String order) {
System.out.println("๐ ๊ณ ๊ฐ์ด ์ง์ " + order + "๋ฅผ ํฝ์
ํ๋ฌ ์์ต๋๋ค!");
}
}
โ๏ธ BikeDelivery โ ๋ฐฐ๋ฌ์์ด ๋ฐฐ๋ฌ ๐ฒ
โ๏ธ DroneDelivery โ ๋๋ก ์ด ๋ฐฐ๋ฌ ๐
โ๏ธ PickupDelivery โ ๊ณ ๊ฐ์ด ์ง์ ๊ฐ์ ธ๊ฐ ๐
์ด์ ํผ์ ์ฃผ๋ฌธ ์์คํ ์์ ์ด ์ ๋ต์ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ๐
public class PizzaOrder {
private final DeliveryStrategy deliveryStrategy;
private String order;
public PizzaOrder(DeliveryStrategy deliveryStrategy, String order) {
this.deliveryStrategy = deliveryStrategy;
this.order = order;
}
public void deliverOrder() {
deliveryStrategy.deliver(order);
}
}
ํผ์ ์ฃผ๋ฌธ ์์คํ
์ด DeliveryStrategy๋ฅผ ์ด์ฉํ์ฌ ๋ฐฐ๋ฌ ๋ฐฉ์์ ์ ํํฉ๋๋ค.
์ด์ ์ ๋ต์ ์ ํํ์ฌ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
public class Main {
public static void main(String[] args) {
// ๋ฐฐ๋ฌ์์ด ๋ฐฐ๋ฌํ๋ ์ฃผ๋ฌธ
PizzaOrder bikeOrder = new PizzaOrder(new BikeDelivery(), "ํํผ๋ก๋ ํผ์");
bikeOrder.deliverOrder(); // ๐ฒ ๋ฐฐ๋ฌ์์ด ํํผ๋ก๋ ํผ์๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค!
// ๋๋ก ์ด ๋ฐฐ๋ฌํ๋ ์ฃผ๋ฌธ
PizzaOrder droneOrder = new PizzaOrder(new DroneDelivery(), "๋ง๋ฅด๊ฒ๋ฆฌํ ํผ์");
droneOrder.deliverOrder(); // ๐ ๋๋ก ์ด ๋ง๋ฅด๊ฒ๋ฆฌํ ํผ์๋ฅผ ๋ฐฐ๋ฌํฉ๋๋ค!
// ๊ณ ๊ฐ์ด ์ง์ ๋งค์ฅ ํฝ์
ํ๋ ์ฃผ๋ฌธ
PizzaOrder pickupOrder = new PizzaOrder(new PickupDelivery(), "ํ์์ด์ ํผ์");
pickupOrder.deliverOrder(); // ๐ ๊ณ ๊ฐ์ด ์ง์ ํ์์ด์ ํผ์๋ฅผ ํฝ์
ํ๋ฌ ์์ต๋๋ค!
}
}
โ๏ธ bikeOrder๋ ๋ฐฐ๋ฌ์์ด ๋ฐฐ๋ฌ ๐ฒ
โ๏ธ droneOrder๋ ๋๋ก ์ด ๋ฐฐ๋ฌ ๐
โ๏ธ pickupOrder๋ ๊ณ ๊ฐ์ด ์ง์ ํฝ์
๐
๋ฐฐ๋ฌ ๋ฐฉ์์ด ๋ค๋ฅด์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ์ฝ๋ ๊ตฌ์กฐ๋ ์์ ํ ํ์๊ฐ ์์ต๋๋ค! ๐
โ ์ ์ฐํ ์ฝ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ โ ์๋ก์ด ๋ฐฐ๋ฌ ๋ฐฉ์์ด ์ถ๊ฐ๋ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
โ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ โ ๊ณตํต๋ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ๋ค์ํ ๋ฐฐ๋ฌ ์ ๋ต์ ๋ง๋ค ์ ์์ต๋๋ค.
โ ๊ฐ์ฒด์งํฅ ์์น ์ค์ โ ๊ฐ๋ฐฉ-ํ์ ์์น(OCP)์ ์ง์ผ ํ์ฅ์ ์ ๋ฆฌํฉ๋๋ค.
โ ํด๋์ค ์ ์ฆ๊ฐ โ ๋ฐฐ๋ฌ ๋ฐฉ์์ด ๋ง์์ง๋ฉด ํ์ผ์ด ๋ง์์ง๊ณ ๊ด๋ฆฌ๊ฐ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค.
โ ์ ๋ต์ ์ดํดํด์ผ ํจ โ ๊ฐ๋
์ ์ดํดํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
์ ๋ต ํจํด์ ํ๋(์๊ณ ๋ฆฌ์ฆ)์ ์ ์ฐํ๊ฒ ๋ฐ๊ฟ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฐ๋ ฅํ ๋์์ธ ํจํด์ ๋๋ค.
โ
ํผ์ ๋ฐฐ๋ฌ ๋ฐฉ์์ฒ๋ผ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ๋ณ๊ฒฝ๋๋ ๋ก์ง์ด ํ์ํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
โ
์ ๋ต์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์์๋ ๋๋ฏ๋ก ์ ์ง๋ณด์๊ฐ ํธ๋ฆฌํฉ๋๋ค.
โ
ํ์ง๋ง ํด๋์ค๊ฐ ๋ง์์ง ์ ์์ผ๋ฏ๋ก ์ ์ ํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
์์ ์ด์ ๋ค๋ค ๋ฆฌํฉํ ๋ง์ ํด๋ณด๋ฌ ๊ฐ์๋ค! ๐