본문 바로가기
Delvelopment/DesignPattern

[Design Pattern] 전략패턴(STRATEGY PATTERN)

by 제제킴 2022. 5. 16.
반응형

전략패턴(Strategy Pattern)은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해준다. 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다.

동일 계열의 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하며, 이들을 상호교환이 가능하도록 만든다. 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 알고리즘을 다양하게 변경 할 수 있게한다.

객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법이다.

전략 패턴은 전략 클래스를 캡슐화 하기 위한 노력을 합니다. 전략화를 통해 여러가지 전략 추가에 대한 확장성을 고려하게 됩니다.

 

  • 구조

  • 활용성
    • 행동들이 조금씩 다를 뿐 개념적으로 관련된 많은 클래스들이 존재할 때. 전략 패턴은 많은 행동 중 하나를 가진 클래스를 구성할 수 있는 방법을 제공한다.
    • 사용자가 몰라야 하는 데이터를 사용하는 알고리즘이 있을때, 노출하지 말아야 할 복잡한 자료 구조는 Strategy 클래스에 두면 된다.
    • 하나의 클래스가 많은 행동을 정의하고, 이런 행동들이 그 클래스의 연산 안에서 복잡한 다중 조건문의 모습을 취할때, 많은 조건문 보다는 각각을 Strategy 클래스로 옮겨놓는 것이 좋다.

 

  • 동일 계열의 관련 알고리즘군이 생긴다. (캡슐화를 통해 재사용이 가능하다)
  • 서브클래싱을 사용하지 않는 대안이다.
  • 조건문을 없앨 수 있다.
  • 구현의 선택이 가능하다.
  • 사용자는 서로 다른 전략을 알아야 한다.
  • Strategy객체와 Context객체 사이에 의사소통 오버헤드가 있습니다.
  • 객체 수가 증가합니다.

 

전략 패턴 적용 예시

 

package pattern.strategy;

public interface Position {

    void move();

    void stop();

}
package pattern.strategy;

public class CarStrategy implements Position {

    @Override
    public void move() {
        System.out.println("출발하다.");
    }

    @Override
    public void stop() {
        System.out.println("정지하다.");
    }
}
package pattern.strategy;

import java.util.Objects;

public class Car {

    private CarStrategy carStrategy;

    public void move() {
        if (Objects.nonNull(carStrategy)) {
            carStrategy.move();
        }
    }

    public void stop() {
        if (Objects.nonNull(carStrategy)) {
            carStrategy.stop();
        }
    }

    public void setCarStrategy(CarStrategy carStrategy) {
        this.carStrategy = carStrategy;
    }

}
package pattern.strategy;

import java.util.Objects;

public class Flight {

    private FlightStrategy flightStrategy;

    public void move() {
        if (Objects.nonNull(flightStrategy)) {
            flightStrategy.move();
        }
    }

    public void stop() {
        if (Objects.nonNull(flightStrategy)) {
            flightStrategy.stop();
        }
    }

    public void setFlightStrategy(FlightStrategy flightStrategy) {
        this.flightStrategy = flightStrategy;
    }

}
package pattern.strategy;

public class FlightStrategy implements Position {

    @Override
    public void move() {
        System.out.println("이륙하다");
    }

    @Override
    public void stop() {
        System.out.println("착륙하다");
    }
}
package pattern.strategy;

public class StrategyPattern {

    public StrategyPattern() {
        Car car = new Car();
        Flight flight = new Flight();

        car.setCarStrategy(new CarStrategy());
        car.move();
        car.stop();

        flight.setFlightStrategy(new FlightStrategy());
        flight.move();
        flight.stop();
    }
}

 


Java 에서 사용되는 전략 패턴

Strategy (recognizeable by behavioral methods in an abstract/interface type which invokes a method in an implementation of a different abstract/interface type which has been passed-in as method argument into the strategy implementation)


반응형

댓글