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();;
    }
}

+ Recent posts