개발/디자인패턴

[Java][디자인 패턴] 23. 전략 패턴 (Strategy Pattern)

nova_dev 2022. 3. 27. 00:00
반응형

디자인패턴
[Java][디자인 패턴] 23. 전략 패턴 (Strategy Pattern)

전략 패턴은 객체 내부에서 해결해야 하는 목적을 알고리즘 객체로 분리 적용하는 기법이다. 실제 내부 동작을 외부 알고리즘 객체로 분리하여 유연하게 동작을 변경시킬 수 있다.

 전략 패턴이란?

  • 전략 패턴은 구조 그대로 사용하면서 캡슐화된 알고리즘으로 동작을 변경하는 행위 (전체 행위 변경)
  • 전략 패턴은 행동 변경 시 조건문을 사용하지 않음. 알고리즘 캡슐화를 통해 조건문 없이도 원하는 행동으로 교체 가능하다. 하지만 알고리즘 객체가 교체된다는 점에서 실행 시 많은 수의 객체를 갖는다는 단점이 있다.
  • 전략패턴은 다양한 알고리즘을 적용하여 처리할 때 매우 유용하여 다양한 경우에 사용된다.

 

 전략 패턴 구조

 전략 패턴 코드

1. Weapon 인터페이스

public interface Weapon {
    void attack();
}

2. Weapon 구현체 클래스

public class Gun implements Weapon {
    @Override
    public void attack() {
        System.out.println("총을 발포합니다.");
    }
}
public class Knife implements Weapon {
    @Override
    public void attack() {
        System.out.println("칼을 휘두릅니다.");
    }
}

3. Strategy 추상 클래스

public abstract class Strategy {

    protected Weapon delegate;

    public void setDelegate(Weapon delegate) {
        System.out.println("무기를 교환합니다.");
        this.delegate = delegate;
    }

    abstract public void attack();
}

3. Strategy를 상속한 Character 클래스

public class Character extends Strategy {
    @Override
    public void attack() {
        if (this.delegate == null) {
            System.out.println("맨손 공격");
        } else {
            this.delegate.attack();
        }
    }
}

4. 테스트 코드

class CharacterTest {
    @Test
    @DisplayName("테스트")
    void characterTest() {
        Strategy strategy = new Character();
        strategy.attack();

        strategy.setDelegate(new Knife());
        strategy.attack();

        strategy.setDelegate(new Gun());
        strategy.attack();
    }
}
맨손 공격
무기를 교환합니다.
칼을 휘두릅니다.
무기를 교환합니다.
총을 발포합니다.

 Github 코드

Github 예제 코드 링크

Github 예제 테스트 코드 링크

참고 자료

 

 

 

 

 

반응형