개요
객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여
객체의 행위를 동적으로 바꾸고 싶은 경우 행위를 직접 수정하는 것이 아니라 전략을 바꿔주기만 하는 패턴
예시
Bus와 Train을 Movable interface를 정의하여 상속받아 구현체를 작성했다고 가정하자
Bus는 도로를 달리고 Train은 선로를 따라 이동을 한다.
현 상태에서 기존 상태로 구현을 해도 큰 무리가 없다.
가정: 만약 선로를 따라 이동하는 버스가 개발되었다고 해보자.
그럼 Bus(구현체)의 move() 함수를 수정할 것인가?
→ SOLID 원칙중 OCP(Open-Closed Principle)에 위배된다.
구현체를 수정하지 않으면서 행위가 수정되어야 한다.
•
기존
•
전략 패턴 적용
전략패턴을 적용하여 MovableStrategy 인터페이스를 구현하면 다음과 같은 차이점이 있다.
public class Moving {
prviate MovableStrategy movableStrategy;
public void move() {
this.movableStrategy.move();
}
public void setMovableStrategy(MovableStrategy movableStrategy) {
this.movableStrategy = movableStrategy;
}
}
public class Bus extends Moving { public class Train extends Moving {
} }
// 선로를 이동하는 버스를 만들어달라는 요구사항
Moving bus = new Bus();
// 기존 도로를 달리는 버스
bus.setMovableStrategy(new RoadStrategy());
//위 코드를 아래와 같이 수정
bus.setMovableStrategy(new RailRoadStrategy());
Java
복사
전략 패턴을 적용하면 위와 같이 구현체의 수정 없이 전략을 바꿔줌으로써 기존 구현체의 코드를 수정하지 않고 유연하게 요구사항을 만족시킬 수 있다.
전략 패턴의 장 단점
장점
•
런타임에 알고리즘을 쉽게 교체할 수 있어 유연성이 높아진다.
Moving bus = new Bus();
// 기존 도로를 달리는 버스
bus.setMovableStrategy(new RoadStrategy());
//위 코드를 아래와 같이 수정
bus.setMovableStrategy(new RailRoadStrategy());
Java
복사
위와 같이 런타임중에 선로를 달리는 버스를 만들 수도 있고 도로를 달릴 수 있는 버스도 만들 수 있다.
•
알고리즘을 개별 클래스로 분리함으로써 각 클래스가 하나의 책임을 가질 수 있도록 설계할 수 있다. (응집도 증가)
•
코드의 재사용성이 증가한다. (동일한 알고리즘을 다른 컨텍스트에서 재사용할 수 있다.)
단점
•
클래스의 수가 증가하여 관리가 더 필요해진다.
•
클라이언트가 적절한 전략을 선택해야 하는데, 이는 잘못된 전략 선택으로 이어질 수도 있다.
결론
전략 패턴의 가장 큰 장점인 “런타임에 알고리즘을 교체할 수 있다”는 점은 프로그램이 상황에 따라 적절한 전략을 선택하고 사용할 수 있음을 의미한다.
결국 전략패턴으로 프로그램이 더 유연해지고 다양한 요구사항에 맞게 쉽게 확장될 수 있다.