공부합시다/DesignPattern

[Design Pattern] 스트래티지(Strategy) 패턴

2023. 4. 2. 23:48
목차
  1. 스트래티지(Strategy) 패턴이란?
  2. 스트래티지 패턴의 장점
  3. 코드 유연성 및 재사용성 향상
  4. 테스트 및 디버깅 간소화
  5. 스트래티지 패턴의 단점
  6. 메모리 사용량 증가 및 성능 저하
  7. 코드의 복잡성 증가
  8. 구현 예제

스트래티지(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
  1. 스트래티지(Strategy) 패턴이란?
  2. 스트래티지 패턴의 장점
  3. 코드 유연성 및 재사용성 향상
  4. 테스트 및 디버깅 간소화
  5. 스트래티지 패턴의 단점
  6. 메모리 사용량 증가 및 성능 저하
  7. 코드의 복잡성 증가
  8. 구현 예제
'공부합시다/DesignPattern' 카테고리의 다른 글
  • [Design Pattern] 싱글톤(Singleton) 패턴
  • [Design Pattern] 데코레이터(Decorator) 패턴
  • [Design Pattern] 옵저버(Observer) 패턴
Lede_
Lede_
개발 일지, 아이디어 등 Lede의 기록을 수집하고 기록하는 공간
반응형
Lede_
Lede's Archive
Lede_
전체
오늘
어제
  • 전체보기 (32)
    • 마인크래프트 (9)
      • 스크립트 (8)
      • 플러그인 (1)
    • Unreal Engine (7)
      • 팁 (7)
      • Material (0)
    • 공부합시다 (9)
      • DesignPattern (4)
      • Java, Android (5)
    • 책 리뷰 (1)
      • Clean Code (1)
    • 프로젝트 (0)
    • 튜토리얼 (6)
      • 마인크래프트 스크립트 (4)
      • 마인크래프트 플러그인 (2)
hELLO · Designed By 정상우.
Lede_
[Design Pattern] 스트래티지(Strategy) 패턴
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.