[전략패턴] 전략(Strategy)패턴 정리 + 적용해 보기

Jae Eon·2021년 6월 27일
0

백엔드 공부

목록 보기
5/17

들어가며

전략패턴은 무엇이며, 전략패턴을 사용하는 상황을 소개하고 실제 코드에 적용한 내용을 정리하기 위한 포스트 입니다.

🍊 전략 패턴 정의

전략 패턴(Strategy Pattern)은 행위패턴의 한 종류로 다양한 전략(알고리즘, 행위)를 하나의 클래스(인터페이스)로 캡슐화 하여 알고리즘의 대체가 가능하도록 설계된 패턴이다.
객체를 사용하는 코드에서 어떤 패턴클래스가 할당 됐는지엔 관계없이 인터페이스만을 인자로 받아서 그대로 내부 메서드를 수행한다.
객체의 내부 코드를 수정할 필요없이 유연한 변경에 대처할 수 있다.

🍑 전략 패턴을 사용하는 상황

이후에 소개할 상태 패턴과 유사해 헷갈릴 수도 있다(둘다 행위패턴).
왜냐하면 둘다 인터페이스를 사용해 어떤 클래스가 할당(구현체) 되었는지 관계없이 내부의 동일 메서드를 수행하기 때문이다.

여기서 전략 패턴은 전략을 사용자 혹은 외부에서 변경 해 주어야 하고, 상태 패턴은 스스로가 상태를 변환 할 수있다.
따라서 전략패턴은 전략을 사용자가 선택해서 상황에 맞는 행동을 하게 할때 주로 사용한다.

그예로 환율을 다르게 적용하여 계산하기, 해쉬값을 생성할때 알고리즘을 다르게 적용하여 생성하기와 같은 전략이 있을 수있다.

🍓 전략패턴을 코드에 적용하기

전략패턴을 자동차 경주 미션에 적용한 코드로 설명하겠다.

  • Interface : 자동차가 움직일 수 있는지 판단하는 전략을 인터페이스로 선언한다
public interface MoveConditionStrategy {
    boolean isMovable();
}
  • 전략 Class : 랜덤으로 생성되는 값이 4(전략 값)보다 크면 움직일 수 있음(true)을 반환 한다.
public class RandomMoveConditionStrategy implements MoveConditionStrategy {
    private static final int MOVE_CONDITION = 4;
    @Override
    public boolean isMovable() {
        if (RandomNumber.makeOneRandomNumber() > MOVE_CONDITION) {
            return true;
        }
        return false;
    }
}
  • 객체 Class : Car 객체는 움직일 수 있는지 판단하는 전략을 가지고 있고 생성자를 통해 전략을 주입 받는다.
public class Car {
    private String name;
    private DistanceLog distanceLog;
    private MoveConditionStrategy moveConditionStrategy;
    
    public Car(String name, MoveConditionStrategy moveConditionStrategy) {
        this(name, moveConditionStrategy, INITIAL_DISTANCE);
    }
  • 객체 인스턴스 생성 : 공용 인터페이스를 선언하고 객체 클래스를 인스턴스로 생성한 뒤 객체 인스턴스(Car)를 생성한다.
MoveConditionStrategy moveConditionStrategy = new RandomMoveConditionStrategy();

new Car("새자동차",moveConditionStrategy);
profile
🖋정리를 안하면 잊어버린다.👣한 발자국씩 가보자!

0개의 댓글