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) 받아 사용 하는것을 적절히 조합해서 설계하는게 좋다.
(사실 저 예시도 마음에 안든다.. 딱히 적절한 예시가 생각나지 않아서 끼워맞춘 느낌이 없지않아 있다.)
'Programinng > Design Pattern' 카테고리의 다른 글
자바(Java) - Factory Pattern 팩토리 패턴 (0) | 2012.12.15 |
---|---|
자바(Java) - Template Method Pattern 템플릿 메소드 패턴 (0) | 2012.12.15 |
Thinking in Patterns with Java (0) | 2012.12.15 |
자바(Java) - Builder Pattern 빌더 패턴 (0) | 2012.12.15 |
자바(Java) - Singleton Pattern , 싱글턴 패턴 (0) | 2012.12.15 |