공부/소프트웨어공학

[디자인패턴] 스트래티지(Strategy) 패턴이란?

돌멩이수프 2024. 11. 8. 16:58
728x90

쉽게 말해! 알고리즘의 변화를 캡슐화로 처리하자

 

Strategy 패턴은 Behavioral Pattern이다.

 

이처럼 Robot을 extends하는 두 개의 디테일한 로봇 태권브이와 아톰이 있다고 하자. 태권브이의 move는 걷기이며 attack은 미사일을 사용한다. 아톰의 move는 날기이며 attack은 펀치이다.

public abstract class Robot {
    private String name;
    public abstract void move();
    public abstract void attack();
    public  Robot(String name) { this.name = name; }
    public String getName() { return name; }
}
-
public class TaekwonV extends Robot{

    public TaekwonV(String name) {
        super(name);
    }

    @Override
    public void move() {
        System.out.println("can only walk");
    }

    @Override
    public void attack() {
        System.out.println("Missile");
    }
}
-
public class Atom extends Robot {
    public Atom(String name) {
        super(name);
    }

    @Override
    public void move() {
        System.out.println("Can fly");
    }

    @Override
    public void attack() {
        System.out.println("Can punch");
    }
}
-
public class Main {
    public static void main(String[] args) {
        Robot r1 = new TaekwonV("robot1");
        Robot r2 = new Atom("robot22");

        System.out.println(r1.getName());
        r1.move();
        r1.attack();

        System.out.println(r2.getName());
        r2.move();
        r2.attack();
    }
}

 

문제점

  • 기존 로봇의 공격 또는 이동 방법을 수정하려면? 예를 들어 아톰을 걷게 하거나 태권V를 날게 하려면?
  • 새로운 로봇을 만들어 기존 공격 또는 이동 방법을 추가/수정하려면? 새로운 로봇 썬가드가 나와 태권V의 미사일 공격 기능을 추가하려면?

➡️ 기존 코드를 수정하거나 삭제하는 행위를 하게 된다. 즉, SOLID 원칙 중 OCP에 위배된다.

위 코드를 OCP에 만족하도록 하기 위해 수정해보자. OCP에 만족하지 않는 코드를 만족하도록 하는 방법론이 있다.

  1. 변하는 것을 식별하고
  2. 변하는 것을 클래스로 분리한다
  3. 변하는 것들을 포용하는 개념을 추상 클래스나 인터페이스로 추상화한다
  4. 2번에서 만든 클래스를 3번 단계에서 추출한 추상화된 개념의 자식클래스로 모델링한다

 

  1. 우리의 상황에서 변하는 것은 걷기, 날기/미사일, 펀치이다.
  2. Walk, Fly/Missile, Punch 클래스로 분리한다.
  3. 이들을 포용하는 개념인 Move/ Attack을 interface로 추상화한다.
  4. Walk, Fly는 Move의 자식클래스로, Missile, Punch는 Attack의 자식클래스로 모델링한다.

이를 클래스 다이어그램을 통해 보면 다음과 같다.

Atom은 FlyingStrategy로 설정된 MoveStrategy와 PunchStrategy로 설정된 AttackStrategy를 세팅한다. 만약 걷는 것으로 이동 동작을 변경하고 싶다면 MoveStrategy를 WalkingStrategy로 변경해주기만 하면 된다. 기존의 코드를 변경할 필요가 없다. 새로운 이동 동작으로 달리기 등을 추가하고 싶다면 MoveStrategy를 실체화하는 RunStrategy를 생성하면 된다.

➡ 새로운 로봇의 등장, 움직임의 변화에도 기존 코드는 영향을 끼치지 않는다.

 

Strategy Pattern은 전략을 쉽게 바꿀 수 있도록 하는 디자인 패턴이다.

 

 

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

 

전략 패턴

/ 디자인 패턴들 / 행동 패턴 전략 패턴 다음 이름으로도 불립니다: Strategy 의도 전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스에 넣은 후 그들의 객체들을 상호교환

refactoring.guru

 

728x90