전략 패턴이란, 옵션마다의 행동을 캡슐화하여 인터페이스를 정의하고, 독립적이고 상호 교환가능하도록 만드는 패턴
입니다.
예를 들어, CoffeeMachine을 이용해 Coffee를 받으려고할때 Americano와 CafeLatte를 받을 수 있습니다.
public class CoffeMachine{
public brewAmericano(){
Americano americano = new Americano();
return americano.brew();
}
public brewCafeLatte(){
CafeLatte cafeLatte = new CafeLatte();
return cafeLatte.brew();
}
}
이와같이 직접적으로 Americano와 CafeLatte를 의존한다면 새로운 커피종류가 추가되었을 경우 CoffeMachine에 새로운 커피종류를 추가해야하기때문에 OOP원칙에서 개방폐쇄원칙을 위반하게 됩니다.
public Integerface CoffeeStrategy{
String brew();
}
public class AmericanoStrategy implements CoffeeStrategy{
public String brew(){
return "아메리카노";
}
}
public class CafeLatteStrategy implements CoffeeStrategy{
public String brew(){
return "카페라떼";
}
}
public class CoffeeMachine{
CoffeeStrategy coffeeStrategy;
public CoffeeMachine(){};
public String brew(CoffeeStrategy coffeeStrategy){
this.coffeeStrategy = coffeeStrategy;
return coffeeStrategy.brew();
}
}
public class CoffeeMachineButton{
public CoffeeMachineButton(){};
public CoffeeStrategy americanoButton(){
return new AmericanoStrategy();
}
public CoffeeStrategy cafeLatteButton(){
return new CafeLatteStrategy();
}
}
public class Client{
public static void main(String[] args){
CoffeeMachine coffeeMachine = new CoffeeMachine();
CoffeeMachineButton coffeeMachineButton = new CoffeeMachineButton();
String americano = coffeeMachine.brew(coffeeMachineButton.americanoButton());
System.out.println(americano);
String cafeLatte = coffeeMachine.brew(coffeeMachineButton.cafeLatteButton());
System.out.println(cafeLatte);
}
}
이와 같이 커피 종류를 선택하는 전략을 캡슐화하여 인터페이스(CoffeeStrategy)를 정의하여 새로운 커피 종류가 추가되어도 내부적으로 수정하지 않고 커피 종류를 추가할 수 있습니다.