Strategy Pattern 이란?
- 실행 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴
- 특정 계열의 알고리즘을 정의하고 각 알고리즘을 캡슐화하며
이 알고리즘들을 해당 계열 안에서 상호 교체 가능하게 만듦
- Context : Strategy의 인터페이스를 이용하는 역할, 클라이언트는 Context를 통해 전략들을 이용
- Strategy : 클래스 별로 관리한 전략들을 결정하는 역할
- ConcreteStrategy : 클라이언트가 사용하는 전략을 실제로 구현하는 역할
전략 패턴 적용 전
- 상품이 추가되거나 기존 상품이 변경될 때마다 buyProduct 메서드를 수정
- Client가 어떤 이벤트가 발생하여도 모르도록 설계해야 하는데,
해당 방법은 클라이언트 클래스 내에서 작업하므로 좋지 않다.
package BehavioralPattern.Strategy.ori;
public class Client {
public void buyProduct(String product) {
if(product.equals("달걀")) {
System.out.println("300원");
} else if(product.equals("우유")) {
System.out.println("500원");
}
}
}
전략 패턴 적용 후
- 상품 구매라는 메서드를 가지는 인터페이스 구현
- 각 상품들을 클래스로 선언하여 인터페이스 상속 후, 상품 구매 메서드를 재정의
- 상품을 별도 클래스로 관리하기 때문에 상품을 추가, 수정한다고 해도 Client 코드에는 영향을 주지 않는다.
package BehavioralPattern.Strategy;
interface Product {
void buyProduct();
}
class Egg implements Product {
@Override
public void buyProduct() {
System.out.println("달걀 비용 : 300원");
}
}
class Milk implements Product {
@Override
public void buyProduct() {
System.out.println("우유 비용 : 500원");
}
}
class Ramen implements Product {
@Override
public void buyProduct() {
System.out.println("라면 비용 : 700원");
}
}
class Client {
private Product product;
public Client(Product product) {
this.product = product;
}
public void setProduct(Product product) {
this.product = product;
}
public void buyProduct() {
product.buyProduct();
}
}
class Main {
public static void main(String[] args) {
Client client = new Client(new Egg());
client.buyProduct();;
System.out.println("================");
client.setProduct(new Milk());
client.buyProduct();;
System.out.println("================");
client.setProduct(new Ramen());
client.buyProduct();;
}
}