오늘은 행위패턴 중 하나인 전략패턴에 대해 알아보겠다.

Q. 전략패턴이란?
Q. 전략패턴을 사용하는 이유?
Q. 사용하지 않을때 생길 수 있는 문제들?
Q. 위 문제들을 전략패턴을 통해 어떻게 해결하는지?
Q. 장단점
1. 전략패턴이란?
전략 패턴은 프로그램이 진행되면서 캡슐화된 로직을 선택할 수 있게 하는 디자인 패턴이다.
런타임 시점에 특정 로직을 선택할 수 있는 형태이다.
이걸 왜 사용할까?
2. 전략패턴을 사용하는 이유?
민수가 도서관을 가는 방법이 걸어서 가는 방법이 있다고 하자. 어느날 민수에게 특별한 능력이 생겨 날아서 갈 수 있게 되었다. 기존에 걸어서 가는 민수의 움직임 방법을 날아서 갈 수 있게 코드를 수정한다면 민수 움직임에 관련된 많은 코드들이 영향을 받는다. 뿐만 아니라 민수가 걸어서 갈지 날아서 갈지 선택할 수 있게 구현하고 싶다면?
이때 전략패턴을 사용한다면 민수 움직임을 인터페이스로 만들고 걷기와 날기를 구현하여 실행 로직부분에서 어떤 움직임으로 갈지 선택할 수 있다. 처음 걷기 밖에 없었을때도 걷기를 수정하지 않고 날기 움직임을 추가할 수 있고 실행 로직에서 움직임을 선택할 수 있다.
실행 로직을 인터페이스에게 의존시키고 인터페이스를 구현한 구현체를 넘겨주면서 객체간 커뮤니케이션에 유연함을 부여할 수 있다.
3. 예시
안좋은 예
public interface Movement {
void move();
}
public class Human implements Movement {
@Override
public void move() {
System.out.println("걸어서 가기");
}
}
public class Run {
public static void main(String[] args) {
Human human = new Human();
human.move();
}
}

민수가 움직이는 방법을 걸어서 가는것으로 구현했다. 위 예시처럼 날아서 갈 수 있도록 변경해야하거나 다른 여러 움직임으로 변경할 수 있는 확장성을 고려했을때 좋은 구현이 아닌 것 같다.
구현한 move()를 직접 수정하게되거나 로직실행부분에서 if-else 분기문이 필요하게 된다.
좋은 예시
public interface Movement {
void move();
}
public interface MovementStrategy extends Movement {
}
public class WalkMovement implements MovementStrategy {
@Override
public void move() {
System.out.println("걸어서 움직입니다");
}
}
public class FlyMovement implements MovementStrategy {
@Override
public void move() {
System.out.println("날아서 움직입니다");
}
}
public class Human {
private MovementStrategy movementStrategy;
public void setMovementStrategy(MovementStrategy movementStrategy) {
this.movementStrategy = movementStrategy;
}
public void move() {
movementStrategy.move();
}
}
public class Run {
public static void main(String[] args) {
Human human = new Human();
// 도서관 갈때는 걸어서
human.setMovementStrategy(new WalkMovement());
System.out.print("도서관 갈때는 ");
human.move();
// 여행 갈때는 날아서
human.setMovementStrategy(new FlyMovement());
System.out.print("여행 갈때는");
human.move();
}
}

움직임 인터페이스에 대한 전략 인터페이스를 추가로 만들고 전략을 행할 주체가 움직임 전략을 멤버변수로 가지고 있습니다.
로직 실행부분에서 원하는 움직임을 선택하여 구현할 수 있습니다.
기존 코드 수정없이 새로운 움직임 전략을 추가할 수 있고 분기처리없이 움직임을 선택할 수 있다.
4. 마무리
지금까지 전략패턴과 그에 대한 예시를 살펴보았다. 처음 질문들에 대해 대답해보면서 이해하였는지 파악해보도록 하자
Q. 전략패턴이란?
Q. 전략패턴을 사용하는 이유?
Q. 사용하지 않을때 생길 수 있는 문제들?
Q. 위 문제들을 전략패턴을 통해 어떻게 해결하는지?
Q. 장단점
'리팩토링 > 디자인패턴' 카테고리의 다른 글
| [디자인패턴] 퍼사드 패턴 (1) | 2022.11.26 |
|---|---|
| [디자인패턴] 어댑터 패턴 (1) | 2022.11.14 |
| [디자인패턴] 팩토리 메서드 패턴, 추상 팩토리 패턴 (1) | 2022.10.30 |
| [디자인패턴] 싱글턴 패턴 (2) | 2022.10.24 |
| [디자인패턴] 옵저버 패턴 (4) | 2022.10.14 |