[JAVA] 전술패턴(Strategy Pattern)

종원유·2022년 2월 15일
0

Java

목록 보기
7/11
post-thumbnail

이번 포스트는 디자인 패턴 중 하나인 전술 패턴에 대해서 정리하려고 한다.

전술패턴(Strategy Pattern)

전술패턴이란 디자인 패턴의 한 종류로 조건이나 상황에 따라 다른 전략(알고리즘 등)을 사용해야 할 때, 다양한 전략들을 인터페이스 정의를 통해 캡슐화하여 전략을 동적으로 바꿔 유연하게 확장하는 패턴이다.

전략패턴 구현

전략(알고리즘)

public interface Strategy {
    public int salaryIncreaser(int salary);
}

//사원의 급여는 200만원이 증가한다.
public class StaffStrategy implements Strategy{
    @Override
    public int salaryIncreaser(int salary) {
        return salary + 200;
    }
}

//매니저의 급여는 300만원 증가한다.
public class ManagerStrategy implements Strategy{
    @Override
    public int salaryIncreaser(int salary) {
        return salary + 300;
    }
}

//감독관의 급여는 400만원이 증가한다.
public class DirectorStrategy implements Strategy{
    @Override
    public int salaryIncreaser(int salary) {
        return salary + 400;
    }
}

상황 예

주식회사 벨로그는 새해를 맞아 연봉이 인상된다.
연봉 인상률은 직급에 따라서 다르다.
스태프의 경우 200만원, 매니저의 경우 300만원, 디렉터의 경우는 400만원이 연차마다 인상된다.

예시로 제시한 알고리즘의 경우 굉장히 간단하여 하나의 전략으로 파라미터를 통해 계산식을 정의해도 되지만, 간단한 예로 작성한 것입니다.

위와 같은 상황일 때, 직급마다 알고리즘(전술)이 다르므로 각각의 3가지 전략을 생성한다.

  • StaffStrategy
  • ManagerStrategy
  • DirectorStrategy

생성한 여러 전략은 interface를 정의하여 클라이언트와 관심사를 분리하고 캡슐화합니다.

계산 기능 객체

public class Calculator {

    private final Strategy strategy;

    public Calculator(Strategy strategy) {
        this.strategy = strategy;
    }

    public int calculate(int salary){
        return strategy.salaryIncreaser(salary);
    }
}

급여 계산을 수행하는 객체를 정의합니다.

이 때, 급여 계산 알고리즘은 클라이언트에게 전달받아 계산하도록하여 동적으로 전략을 바꿔 계산할 수 있도록 합니다.

VO


@Builder
@ToString
@AllArgsConstructor
public class Worker {

    private String name;

    private int salary;

}

클라이언트


public class Main {

    public static void main(String[] args) {

        Calculator staffCalculator = new Calculator(new StaffStrategy());
        Calculator managerCalculator = new Calculator(new ManagerStrategy());
        Calculator directorCalculator = new Calculator(new DirectorStrategy());

        Worker staff = new Worker.WorkerBuilder()
                .name("staff")
                .salary(staffCalculator.calculate(3000))
                .build();
        Worker manager = new Worker.WorkerBuilder()
                .name("manager")
                .salary(managerCalculator.calculate(4500))
                .build();
        Worker director = new Worker.WorkerBuilder()
                .name("director")
                .salary(directorCalculator.calculate(6000))
                .build();

        System.out.println(staff.toString());
        System.out.println(manager.toString());
        System.out.println(director.toString());
    }
}

여러 전략을 동적으로 생성하여 상황에 맞는 알고리즘을 사용합니다.

출력결과

Worker(name=staff, salary=3200) 200인상
Worker(name=manager, salary=4800) 300인상
Worker(name=director, salary=6400) 400인상


정리

정리하자면,

객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장할 수 있는 디자인 패턴입니다.

profile
개발자 호소인

1개의 댓글

comment-user-thumbnail
2022년 2월 27일

정말 멋있으시네요. 많이 배워갑니다. ^^7

답글 달기