스트래티지(Strategy) 패턴이란?
- 스트래티지 패턴은 알고리즘을 정의하고 캡슐화 하여 런타임에 상호 교환하여 사용할 수 있도록 한다.
- 즉, 모듈식으로 접근할 수 있는 방식을 제공함으로서 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있도록 한다.
스트래티지 패턴의 장점
코드 유연성 및 재사용성 향상
- 각 알고리즘을 별도의 클래스에 캡슐화하면 기존 기능을 변경하지 않고 새로운 기능의 확장이 가능하기 때문에 보다 안정적이고 확장에 유리하다.
- 여러 객체간에 알고리즘을 공유하여 사용할 수 있으므로 유지 및 관리 비용이 절감된다.
테스트 및 디버깅 간소화
- 각 알고리즘은 별도의 클래스로 캡슐화 되어있기 때문에 버그 또는 오류가 발생할 가능성이 줄어든다.
스트래티지 패턴의 단점
메모리 사용량 증가 및 성능 저하
- 알고리즘 객체를 생성하고 변경하는 과정에서 많은 객체가 생성될 수 있기 때문에 메모리 사용량이 증가하고 성능 저하의 가능성이 존재한다.
코드의 복잡성 증가
- 필요한 알고리즘이 늘어날수록 각 알고리즘을 캡슐화한 클래스의 수가 늘어나기 때문에 코드의 구조가 복잡해질 수 있으며 이에 따라 잠재적으로 유지 및 관리 비용이 증가할 수 있다.
구현 예제
다음은 RPG 게임을 예로 들어 설명한 스트래티지 패턴의 구현 예제이다.
먼저 스트래티지 패턴의 클래스를 정의한다.
// Context class (스트래티지 패턴을 이용하는 역할)
public class Player {
private Skill skill;
public void setSkill(Skill skill) { // 해당 setter를 이용하여 런타임에 알고리즘 설정
this.skill = skill;
}
public void useSkill() { // 알고리즘 사용
skill.use();
}
}
// Strategy interface (알고리즘을 캡슐화한 interface)
public interface Skill {
void use();
}
// Concrete strategy classes (Strategy interface 를 구현하여 알고리즘을 추가)
public class WarriorSkill implements Skill {
@Override
public void use() {
System.out.println("Warrior uses a skill");
}
}
public class MageSkill implements Skill {
@Override
public void use() {
System.out.println("Mage uses a skill");
}
}
public class ArcherSkill implements Skill {
@Override
public void use() {
System.out.println("Archer uses a skill");
}
}
다음은 Player 객체를 생성하는 예제이다.
public static void main(String[] args) {
Player player = new Player(); // 플레이어 객체를 생성한다
player.setSkill(new WarriorSkill()); // 플레이어의 스킬(알고리즘)을 설정한다.
player.useSkill(); // 플레이어의 스킬(알고리즘)을 사용한다.
}
다음은 런타임에 Player의 스킬을 변경하는 예제이다.
public static void main(String[] args) {
Player player = new Player(); // 플레이어 객체를 생성한다
player.setSkill(new WarriorSkill()); // 플레이어의 스킬(알고리즘)을 설정한다.
player.useSkill(); // 플레이어의 스킬(알고리즘)을 사용한다.
// ~~~ 플레이어가 다른 직업을 선택하면
player.setSkill(new MageSkill()); // 플레이어의 스킬(알고리즘)을 변경한다.
player.useSkill(); // 변경된 스킬(알고리즘)을 사용한다.
}
'공부합시다 > DesignPattern' 카테고리의 다른 글
[Design Pattern] 싱글톤(Singleton) 패턴 (0) | 2023.04.09 |
---|---|
[Design Pattern] 데코레이터(Decorator) 패턴 (0) | 2023.04.05 |
[Design Pattern] 옵저버(Observer) 패턴 (0) | 2023.04.03 |