전략 패턴(Strategy Pattern)이란?
- 행동(알고리즘, 로직)을 캡슐화하여 런타임에 자유롭게 교체할 수 있게 하는 디자인 패턴
- 여러 가지 방식 중 하나를 선택해 실행할 수 있도록 전략(전략 객체)을 분리하고, 이를 사용하는 컨텍스트가 전략을 교체하며 유연하게 동작하게 만든다.
전략 패턴의 필요성
단순 인터페이스 사용 시 발생되는 문제점
interface Moveable {
void move();
}
class WalkCharacter implements Moveable {
public void move() { System.out.println("걷는다"); }
}
class SwimCharacter implements Moveable {
public void move() { System.out.println("수영한다"); }
}
// 클라이언트 사용 예
public class Main {
public static void main(String[] args) {
Moveable character1 = new WalkCharacter();
character1.move(); // 걷는다.
Moveable character2 = new SwimCharacter();
character2.move(); // 수영한다.
}
}
1. 행동을 동적으로 바꿀 수 없다.
- 행동을 바꾸고 싶다면, 객체 자체를 바꾸거나 새로 생성해야 한다.
- 즉, 런타임에 자유롭게 행동 변경할 수 없다.
Moveable character1 = new WalkCharacter();
character1.move(); // 걷는다.
character1 = new SwimCharacter();
character1.move(); // 수영한다.
2. OCP(Open-Closed Principle, 개방-폐쇄 원칙) 위반
- 새로운 행동을 추가하거나 변경하기 위해 기존 클래스를 수정하거나 새로운 클래스를 생성해야 한다.
- 이는 "기존 코드를 변경하지 않고 기능을 확장해야 한다"는 OCP의 원칙에 위배된다.
전략 패턴 구조
주요 구성 요소
- 전략 인터페이스(Strategy Interface)
- 인터페이스는 특정 행동을 수행하는 메서드의 틀을 정의한다.
- 다양한 구체 전략 클래스들이 이 인터페이스를 구현한다.
- ex. MoveStrategy
- 구체 전략(Concrete Strategy)
- 각각의 구체 전략 클래스는 전략 인터페이스를 구현해 특정 행동이나 알고리즘을 정의한다.
- ex. WalkStrategy, SwimStrategy
- 컨텍스트(Context)
- 컨텍스트는 전략 인터페이스를 참조하고, 필요에 따라 실행 중에 전략 객체를 교체할 수 있다.
- 자신의 동작을 구체 전략에 위임하여 실행한다.
- ex. Character
전략 패턴 예시
// 전략 인터페이스
interface MoveStrategy {
void move();
}
// 전략 구현체
class WalkStrategy implements MoveStrategy {
public void move() {
System.out.println("걷는다.");
}
}
class SwimStrategy implements MoveStrategy {
public void move() {
System.out.println("수영한다.");
}
}
// 컨텍스트 클래스
class Character {
private MoveStrategy moveStrategy;
public Character(MoveStrategy moveStrategy) {
this.moveStrategy = moveStrategy;
}
public void setMoveStrategy(MoveStrategy moveStrategy) {
this.moveStrategy = moveStrategy;
}
public void move() {
moveStrategy.move();
}
}
클라이언트 사용 예
public class Main {
public static void main(String[] args) {
Character character = new Character(new WalkStrategy());
character.move(); // 걷는다.
// 전략 교체 (런타임에 행동 변경)
character.setMoveStrategy(new SwimStrategy());
character.move(); // 수영한다.
}
}
전략 패턴의 장단점
장점
- 행동을 동적으로 교체 가능
- 클래스 폭발 문제 완화- 유지보수와 테스트가 용이
- 책임 분리 및 코드 재사용성 증가
- OCP(개방-폐쇄 원칙) 준수
단점
- 클래스 수가 증가하여 관리가 어려워질 수 있음
- 단순한 문제에 적용 시 구조가 복잡해질 수 있음
- 전략 선택 및 관리 책임이 분산될 수 있음
- 전략 간 상호작용이 필요한 경우 조율이 어려울 수 있음
참고 자료
https://victorydntmd.tistory.com/292
[디자인패턴] 전략 패턴 ( Strategy Pattern )
전략 패턴 ( Strategy Pattern )객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여,객체의 행위를 동적으로 바꾸고 싶은 경우 직접
victorydntmd.tistory.com
💠 전략(Strategy) 패턴 - 완벽 마스터하기
Strategy Pattern 전략 패턴은 실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴 이다. 여기서 '전략'이란 일종의 알고리즘이 될 수
inpa.tistory.com
'Spring > 아키텍처, 설계' 카테고리의 다른 글
템플릿 메서드 패턴(Template Method Pattern) (1) | 2025.06.18 |
---|---|
Interceptor vs AOP(Aspect Oriented Programming) (0) | 2025.06.11 |
Entity와 DTO(Data Transfer Object)의 차이 (0) | 2025.05.09 |