본문 바로가기

Programinng/Design Pattern

자바(Java) - Strategy Pattern 스트래티지 패턴

Strategy Pattern(전략 패턴)은 Design Pattern에서 가장 많이 사용되는 패턴 중 하나 이며, OCP(Open-Closed Principle)을 잘 실현하고 있다. 

Strategy Pattern은 알고리즘을 Encapsulation하여 각각 정의하고, 이를 교체해서 같은 문제를 다른 방법으로 사용한다. 이렇게 함으로 실제 사용하는 클라이언트와는 독릭접으로 구현될 수 있다.


다음 예제를 보자. 이해를 돕기 위해 최대한 심플하게 구현하겠다.


Character 인터페이스는 공격의 기본적인 스펙을 정의하며, 이를 구현하게 될 클래스는 Warrior와 Wizard가 되겠다. 또 이들이 사용하게 될 무기는 Weapon 인터페이스를 구현한다.

public interface Character {
 public void attack();
}

public interface Weapon {
 public void attack();
}


Weapon 인터페이스를 구현한 Sword와 Wand

public class Sword implements Weapon{

 @Override
 public void attack() {
  System.out.println("검을 휘둘러 공격한다.");
 }
}

public class Wand implements Weapon{
 @Override
 public void attack() {
  System.out.println("지팡이를 사용해 마법공격을 한다.");
 }
}


Character 인터페이스를 구현한 Warrior와 Wizard

public class Warrior implements Character{

 private Weapon Weapon = new Sword();
 
 @Override
 public void attack() {
  Weapon.attack();
 }
}

public class Wizard implements Character{
 private Weapon Weapon = new Wand();
 
 @Override
 public void attack() {
  Weapon.attack();
 }
}

이렇게 Strategy Pattern은 공격이라는 행동을 자신이 직접하지 않고 Weapon을 상속받아 구현 Object에 위임(Delegation)하여 문제를 해결 한다. 


그럼 테스트 해보겠다.

Character warrior = new Warrior();
Character wizard = new Wizard();

warrior.attack();
wizard.attack();

-결과

검을 휘둘러 공격한다.

지팡이를 사용해 마법공격을 한다.


이해를 돕기 위해 심플하게 구현하였지만, 위 처럼 new 키워드를 사용해서 객체를 생성하는건 좋지 못하다. 이건 Wizard가 Wand를 너무 잘 알고 있기 때문이다. 이는 요구사항에 맞춰서 Factory Method Pattern과 외부에서 DI(Dependency Injection) 받아 사용 하는것을 적절히 조합해서 설계하는게 좋다.


(사실 저 예시도 마음에 안든다.. 딱히 적절한 예시가 생각나지 않아서 끼워맞춘 느낌이 없지않아 있다.)