본문

Strategy Pattern (전략 패턴)

반응형

클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴

 


전략 패턴을 구성하는 세 요소는 꼭 기억해둬야 한다.
a) 전략 메서드를 가진 전략 객체

b) 전략 객체를 사용하는 컨텍스트 (전략 객체의 사용자/소비자)

c) 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트 (제 3자, 전략 객체의 공급자)

 

 

군인이 있다고 상상해 보자. 그리고 그 군인이 사용할 무기가 있다고 하자. 보급 장교가 무기를 군인에게 지급해 주면 군인은 주어진 무기에 따라 전투를 수행하게 된다. 이 이야기를 전략 패턴에 따라 구분해 보면 무기는 전략이 되고, 군인은 컨텍스트, 보급 장교는 제3자, 즉 클라이언트가 된다.

 

 

💡 interface

public interface Strategy {
    public abstract void runStrategy();
}

 

 

💡 source

public class StrategyGun implements Strategy {

    @Override
    public void runStrategy() {
        System.out.println("탕 탕 탕 ");

    }
}

public class StrategySword implements Strategy {

    @Override
    public void runStrategy() {
        System.out.println("챙 챙 챙");

    }

    public class StrategyBow implements Strategy {

        @Override
        public void runStrategy() {
            System.out.println("슈웅 쏴악");
        }
    }

    public class Soldier {
        void runContext(Strategy strategy) {
            System.out.println("전투 시작");
            strategy.runStrategy();
            System.out.println("전투 종료");

        }
    }

public class Client {

    public static void main(String[] args) {
        Strategy strategy = null;
        Soldier soldier = new Soldier();

        // '총'을 군인에게 전달해서 전투를 수행하게 한다.
        strategy = new StrategyGun();
        soldier.runContext(strategy);
        System.out.println();

        // '검'을 군인에게 전달해서 전투를 수행하게 한다.
        strategy = new StrategySword();
        soldier.runContext(strategy);
        System.out.println();

        // '활'을 군인에게 전달해서 전투를 수행하게 한다.
        strategy = new StrategyBow();
        soldier.runContext(strategy);
    }
}

 

 

💡 결과

전투 시작
탕 탕 탕 
전투 종료

전투 시작
챙 챙 챙
전투 종료

전투 시작
슈웅 쏴악
전투 종료

 

위 코드처럼 전략을 다양하게 변경하면서 컨텍스트를 실행할 수 있다. 

 

전략 패턴은 이미 밝힌대로 디자인 패턴의 꽃이라고 할 정도로 다양한 곳에서 다양한 문제 상황의 해결책으로 사용된다. 또한 단일 상속만이 가능한 자바 언어에서는 상속이라는 제한이 있는 템플릿 메서드 패턴보다 전략 패턴이 더 많이 활용된다.

 

반응형

공유

댓글