리셋 되지 말자

전략 패턴(Strategy Pattern) 본문

Java(폐지)/디자인 패턴

전략 패턴(Strategy Pattern)

kyeongjun-dev 2020. 8. 5. 14:46

책보다 설명이 잘 되어 있어서 링크 남김. https://victorydntmd.tistory.com/292
https://meylady.tistory.com/53?category=795226

전략 패턴


객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여,

객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다.

간단히 말해서 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴입니다.

예시 코드

  • MovableStrategy.java
package strategyPattern;

public interface MovableStrategy {
    public abstract void move(); 
}
  • Moving.java
package strategyPattern;

public class Moving {
    private MovableStrategy movableStrategy;

    public void move() {
        movableStrategy.move();
    }

    public void setMovableStrategy(MovableStrategy movableStrategy) {
        this.movableStrategy = movableStrategy;
    }
}
  • LoadStratege.java
package strategyPattern;

public class LoadStrategy implements MovableStrategy{
    public void move() {
        System.out.println("도로로 이동");
    }

}
  • RailLoadStratege.java
package strategyPattern;

public class RailLoadStrategy implements MovableStrategy{
    public void move() {
        System.out.println("선로로 이동");
    }

}
  • Train.java
package strategyPattern;

public class Train extends Moving {

}
  • Bus.java
package strategyPattern;

public class Bus extends Moving{

}
  • Client.java
package strategyPattern;

public class Client {
    public static void main(String[] args) {
        Moving train = new Train();
        Moving bus = new Bus();

        // 기존의 기차와 버스의 이동 방식
        // 기차 : 선로, 버스 : 도로
        train.setMovableStrategy(new RailLoadStrategy());
        bus.setMovableStrategy(new LoadStrategy());
        train.move();
        bus.move();

        // 선로위를 달리는 버스가 개발
        bus.setMovableStrategy(new RailLoadStrategy());
        bus.move();
    }
}

설명

버스, 기차의 move 메서드를 하나로 묶어서 interface로 분리한다. (MovableStrategy)
객체마다 움직이는 방식을 지정할 수 있도록 구성한다. (새로운 객체 type을 추가하여도, 움직이는 방식을 변경할 필요가 없다.)

템플릿 메서드 패턴과 유사

같은 문제의 해결책에 대해 상속을 이용하는 템플릿 메서드 패턴과 객체 주입을 통한 전략 패턴 중에서 선택/적용할 수 있다.
단일 상속만 가능한 자바 언어에서는 상속이라는 제한이 있는 템플릿 메서드 패턴보다는 전략 패턴이 더 많이 활용된다.

  • 클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴
  • 개방 폐쇄 원칙(OCP)와 의존 역전 원칙(DIP)가 적용됨
Comments