전략 패턴

이정석·2023년 6월 23일
0

디자인패턴

목록 보기
20/23

전략 패턴이란?

알고리즘의 패밀리를 정의하며 알고리즘을 객체로 만들어 갭슐화하고 별도의 클래스에 넣은 후 패밀리에 해당하는 전략객체들을 상호교환 할 수 있도록 하는 패턴이다.


문제상황

게임에서 캐릭터가 공격(attack)하는 방법에 , , 도끼가 있다 하자.
1. 캐릭터에 해당하는 Character 클래스는 다음과 같다.

public class Character {
    public void attack(String type) {
        if (type.equals("Sword")) {
            System.out.println("Sword attack.");
        } else if (type.equals("Bow")) {
            System.out.println("Bow attack.");
        } else if (type.equals("Ax")) {
            System.out.println("Ax attack.");
        }
    }
}

위의 구조는 새로운 공격 방식이 추가될 때 Character의 attck을 변경해야한다. 그리고 attack외에 다른 방어(defense)메소드가 추가된다면? 각 메소드에 if-else문이 반복되고 코드의 가독성이 크게 떨어질 것이다.

전략(Strategy)객체를 만들어 전략에 해당하는 행동을 '전략객체'에 위임하자


구조

  1. Strategy: 전략을 정의하는 인터페이스로 ConcreteStrategy가 구현해야 할 메소드를 정의한다.
  2. ConcreteStrategy: Strategy를 상속받아 실제 실행할 전략을 구현한 클래스이다.
  3. Context: 전략객체를 사용할 클래스로 Strategy를 참조하고 상황에 따라 전략객체를 교체할 수 있다. 전략을 바꾸기 위한 setter 메서드를 가지고 있어야 한다.

코드(JAVA)

1. AttackStrategy

public interface AttackStrategy {
    void attack();
}

구조에서 Strategy에 해당하는 인터페이스로 Context에서 사용할 attack 메소드를 정의한다.

2. Sword, Bow, Ax AttackStrategy

public class SwordAttackStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("Sword attack.");
    }
}

public class BowAttackStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("Bow attack.");
    }
}

public class AxAttackStrategy implements AttackStrategy {
    @Override
    public void attack() {
        System.out.println("Ax attack.");
    }
}

ConcreteStrategy에 해당하는 AttackStrategy이며 attack을 오버라이딩한다.

3. Character

public class Character {
    private AttackStrategy strategy;

    public Character(AttackStrategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(AttackStrategy strategy) {
        this.strategy = strategy;
    }

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

Context(Character)를 사용하는 Client는 Character의 전략을 setStrategy를 통해 전략을 교체할 수 있다.


상태패턴과 전략패턴

두 패턴은 행위 자체를 별도의 클래스(State, Strategy)로 캡슐화 하고, 연관 관계를 이용해 행위를 캡슐화한 클래스(Concrete Class)에 실제 작업 수행을 위임하는 측면에서 동일하다. 또한 두 패턴은 실행 중에 행위를 변경할 수 있다.

  • 상태패턴에서 클라이언트는 상태 객체와 관련된 어떤 지식도 없다. 즉, 클라이언트는 Context의 초기 상태만 알고 다른 상태에 대해서는 알지 못한다.
  • 행위를 변경하는 주체의 차이가 있다. 상태패턴은 ConcreteState가 Context의 setState를 통해 상태변환을 하지만 전략패턴은 Client가 Context의 전략을 교체하는 방식이다.

JAVA 객체지향 디자인패턴 - CHAPTER 07 연습문제 1번

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글