본문 바로가기
디자인 패턴

자바(JAVA) - 전략(Strategy) 패턴

by Hyeongjun_Ham 2023. 10. 17.

1. 의도

실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 패턴

 

2. 용도

어떤 일을 수행하는 알고리즘이 여러가지 일때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우 적합

 

3. UML

Strategy UML

 

4. 구현

템플릿 메서드와 비교하기 위해 동일한 예제로 진행한다.

public class CoffeeMaker {

    private Coffee coffee;

    public void setCoffee(Coffee coffee) {
        this.coffee = coffee;
    }

    public void makeCoffee() {
        boilWater();
        putEspresso();
        putIce();
        coffee.makeCoffee();
    }

    private void boilWater() {
        System.out.println("물을 끓인다.");
    }

    private void putEspresso() {
        System.out.println("끓는 물에 에스프레소를 넣는다.");
    }

    private void putIce() {
        System.out.println("얼음을 넣는다.");
    }
public interface Coffee {
    void makeCoffee();
}
public class IceAmericanoStrategy implements Coffee {

    @Override
    public void makeCoffee() {
        System.out.println("시럽을 넣는다.");
    }
}
public class IceLatteStrategy implements Coffee {

    @Override
    public void makeCoffee() {
        System.out.println("우유를 넣는다.");
    }
}
public class Client {
    public static void main(String[] args) {
        CoffeeMaker coffeeMaker = new CoffeeMaker();

        coffeeMaker.setCoffee(new IceAmericanoStrategy());
        coffeeMaker.makeCoffee();

        System.out.println("======================");

        coffeeMaker.setCoffee(new IceLatteStrategy());
        coffeeMaker.makeCoffee();
    }
}
/*
물을 끓인다.
끓는 물에 에스프레소를 넣는다.
얼음을 넣는다.
시럽을 넣는다.
======================
물을 끓인다.
끓는 물에 에스프레소를 넣는다.
얼음을 넣는다.
우유를 넣는다.
*/

 

Context에 전략을 세팅함으로써 다르게 동작하도록 할 수 있다.

 

5. 패턴의 장단점

  • 장점
    • 새로운 전략을 추가하더라도 기존 코드를 변경하지 않는다.
    • 상속 대신 위임을 사용한다.
    • 런타임에 전략을 변경할 수 있다.
  • 단점
    • 복잡도가 증가한다.
    • 클라이언트가 구체적인 전략을 알아야한다.

 

 

출처 :

https://refactoring.guru/design-patterns/strategy

 

Strategy

The Strategy pattern lets you isolate the code, internal data, and dependencies of various algorithms from the rest of the code. Various clients get a simple interface to execute the algorithms and switch them at runtime. The Strategy pattern lets you do a

refactoring.guru