스트레티지 패턴(Strategy Pattern)
- 객체의 동작을 런타임에 선택할 수 있게 하는 행동 디자인 패턴
- 여러 알고리즘을 공통 인터페이스를 구현하는 별도의 클래스로 캡슐화하는 아이디어에 기반한 패턴
- 구성 요소
- 컨텍스트(Context) : 동적으ㅡ로 동작을 변경해야 하는 객체를 포함하는 클래스
- 전략(Strategy) : 모든 알고리즘에 대한 공통 메서드를 정의하는 인터페이스나 추상 클래스
- 구체적인 전략(Concrete Strategy) : 전략 인터페이스를 구현하고 알고리즘의 실제 구현을 제공하는 클래스
- 장점
- 런타임에서 전략을 변경할 수 있다.
- 개방-폐쇄 원칙(OCP) 준수 : 알고리즘 구현을 변경해도 컨텍스트 클래스에 영향을 미치지 않는다.
- 단점
- 여러 클래스를 사용하므로 코드 복잡성이 증가
- 알고리즘 선택이 빈번하게 런타임에서 이루어지면 성능 문제가 발생할 수 있다.
스트레티지 패턴 예시
1. Fighter 클래스를 사용하는 대신, 컨텍스트 생성
2. Kick과 Punch와 같은 공통 동작을 Fighter 클래스에 두고, Jump와 Roll과 같은 특정 동작은 전략 인터페이스로 분리
3. JumpBehavior과 RollBehavior과 같은 구체적인 전략 클래스 구현
4. 컨텍스트 객체는 동작을 변경하기 위해 전략 객체를 사용
위와 같이 구현하면 코드 재사용이 증가하며, 각 서브클래스에서 동작을 다시 정의하지 않아도 된다. Jump나 Roll 동작이 필요한 캐릭터만 해당 동작을 구현하면 되므로 코드 중복이 최소화된다.
// 스트레티지 패턴의 전략 인터페이스
interface FighterStrategy {
void performAttack();
}
// Jump 동작 전략 클래스
class JumpStrategy implements FighterStrategy {
@Override
public void performAttack() {
System.out.println("Jumping!");
}
}
// Roll 동작 전략 클래스
class RollStrategy implements FighterStrategy {
@Override
public void performAttack() {
System.out.println("Rolling!");
}
}
// 컨텍스트 클래스
class Fighter {
private String name;
private FighterStrategy attackStrategy;
public Fighter(String name, FighterStrategy attackStrategy) {
this.name = name;
this.attackStrategy = attackStrategy;
}
public void display() {
System.out.println("Fighter: " + name);
}
public void performAttack() {
attackStrategy.performAttack();
}
}
public class Main {
public static void main(String[] args) {
// Jump 동작을 사용하는 Ryu
Fighter ryu = new Fighter("Ryu", new JumpStrategy());
ryu.display();
ryu.performAttack();
// Roll 동작을 사용하는 Ken
Fighter ken = new Fighter("Ken", new RollStrategy());
ken.display();
ken.performAttack();
// Jump와 Roll 동작을 사용하는 ChunLi
Fighter chunLi = new Fighter("ChunLi", new JumpStrategy());
chunLi.display();
chunLi.performAttack();
}
}
'Computer Science > Design Pattern' 카테고리의 다른 글
[Design Pattern] 옵저버 패턴 (Observer Pattern) (0) | 2023.10.08 |
---|---|
[Design Pattern] 컴포지트 패턴 (Composite Pattern) (0) | 2023.10.08 |
[Design Pattern] 팩토리 메소드 패턴 (Factory Method Pattern) (0) | 2023.09.23 |
[Design Pattern] 템플릿 메소드 패턴 (Template Method Pattern) (0) | 2023.09.23 |
[Design Pattern] 싱글톤 패턴 (Singleton Pattern) (0) | 2023.09.23 |