java/Design Pattern

전략 패턴 (Strategy Pattern)

설기똥꼬 2023. 8. 1. 17:42

이번 포스팅에서는 GoF 디자인 패턴 중 하나인 전략 패턴에 대해 알아보며, 예제를 직접 작성해보고 패턴의 로직을 익혀보겠다.

 

 

전략 패턴이란?

출처 : https://velog.io/@y_dragonrise/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%A0%84%EB%9E%B5-%ED%8C%A8%ED%84%B4Strategy-Pattern

GoF 디자인 패턴 중 하나로, 전략 패턴은 전략을 쉽게 바꿀 수 있도록 하는 디자인 패턴이다.

여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등으로 이해할 수 있다.

프로그램에서 알고리즘의 집합을 정의하고 각각을 캡슐화하여 상호 교환 가능하도록 만든다.

알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경하거나 확장할 수 있으며, 코드의 재사용성과 유연성을 높일 수 있다.

 

 

 

전략 패턴 예제

어떤 소재를 가지고 전략 패턴 알고리즘을 작성해볼까 고민하다가 GPT가  게임 캐릭터와 공격 방식을 추천해줬다.

이를 바탕으로 게임 캐릭터, 그리고 캐릭터의 공격방식을 바탕으로 각각 클래스를 작성하였다!

 

 

 

공격 방식

// 전략 인터페이스: 공격 방식을 정의하는 인터페이스
interface AttackStrategy {
    void attack();
}

비어있는 attack() 함수만 정의되어있는 공격 전략 인터페이스다. 

 

공격 방식 클래스들

class FighterAttack implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("검으로 공격!");
    }
}

class ArcherAttack implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("활로 원거리 공격!");
    }
}

class MageAttack implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("마법으로 공격!");
    }
}

AttackStrategy 인터페이스를 구현한 구체적인 공격방식 클래스이다.

클래스 별로 attack()을 구체적으로 구현하였다!

 

 

게임 캐릭터 클래스

class GameCharacter {
    private AttackStrategy attackStrategy;

    public void setAttackStrategy(AttackStrategy attackStrategy) {
        this.attackStrategy = attackStrategy;
    }

    public void attack() {
        attackStrategy.attack();
    }
}

게임 캐릭터 클래스이다.

AttackStrategy 인터페이스를 활용하여 공격전략을 바꿀 수 있는 setAttackStrategy와 AttackStrategy의 공격 방식을 출력하는 attack()이 있다.

 

 

Main문

public class StrategyPatternExample {
    public static void main(String[] args) {
        // 캐릭터 생성
        GameCharacter character = new GameCharacter();

        // 초기 공격 방식 설정
        character.setAttackStrategy(new FighterAttack());

        // 캐릭터가 검으로 공격
        character.attack();

        // 캐릭터가 활로 공격으로 전환
        character.setAttackStrategy(new ArcherAttack());
        character.attack();

        // 캐릭터가 마법으로 공격으로 전환
        character.setAttackStrategy(new MageAttack());
        character.attack();
    }
}

캐릭터를 생성하여 공격 방식을 설정하고 공격한다.

다른 공격 방식으로 전환한 뒤 공격을 취하는 구조이다.

 

게임 캐릭터가 원하는 공격 방식을 취하고 공격을 할 때마다 다르게 출력됨을 확인할 수 있다.

 

이렇게 전략 패턴을 사용하면 새로운 공격 방식을 추가하거나 기존 방식을 변경하는 작업이 캐릭터 클래스를 수정하지 않고도 가능하다.

스프링에서 UserDao를 통해 Connection객체를 변경할 수 있는 예시에도 전략패턴이 사용되는데, 추후에 학습 후 직접 작성해봐야겠다!