전략 패턴

심야·2022년 11월 17일
0

웹 개발

목록 보기
24/46
post-custom-banner

전략 패턴

전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스(전략들, strategies)에 넣은 후 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴으로 클라이언트는 다양한 전략 중 하나를 선택, 생성 후 컨텍스트에 주입한다.

구성요소

  • 전략 메서드를 가진 전략 객체
  • 전략 객체를 사용하는 컨텍스트(전략 객체의 사용자/소비자)
  • 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트(제 3자, 전략 객체 공급자)

사용 예시

군인과 군인이 사용할 무기가 있다. 그리고 보급 장교가 군인에게 무기를 지급하면 군인은 지급 받은 무기에 따라 전투를 수행한다.

위 예시를 전략 패턴에 맞게 재정의 하면 아래와 같다.

  • 무기 = 전략
  • 군인 = 컨텍스트
  • 보급 장교 = 클라이언트(제3자)

Example

우선 다양한 전략을 공통된 방식으로 사용하기 위해 인터페이스를 정의한다.

Strategy.java

package strategyPattern;

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

StrategyGun.java

전략을 구현한다.

package strategyPattern;

public class StrategyGun implements Strategy{
    @Override
    public void runStrategy(){
        System.out.println("탕, 타당, 타다당");
    }
}

StrategySword.java

전략을 구현한다.

package strategyPattern;

public class StrategySword implements Strategy{
    @Override
    public void runStrategy(){
        System.out.println("챙.. 채쟁쟁 챙챙");
    }
}

StrategyBow.java

전략을 구현한다.

package strategyPattern;

public class StrategyBow implements Strategy{
    @Override
    public void runStrategy(){
        System.out.println("슝.. 쐐액.. 쉑, 최종 병기");
    }
}

Soldier.java

전략을 사용할 컨텍스트를 구현한다.

package strategyPattern;

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

Client.java

클라이언트는 다양한 전략 중 하나를 선택, 생성 후 컨텍스트에 주입한다.

package strategyPattern;

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

        // 총을 람보에게 전달해 전투를 수행하게 한다.
        strategy = new StrategyGun();
        rambo.runContext(strategy);

        System.out.println();

        // 검을 람보에게 전달해서 전투를 수행하게 한다.
        strategy = new StrategySword();
        rambo.runContext(strategy);

        System.out.println();

        // 활을 람보에게 전달해서 전투를 수행하게 한다.
        strategy = new StrategyBow();
        rambo.runContext(strategy);
    }
}

실행 결과

전투 시작
탕, 타당, 타다당
전투 종료

전투 시작
챙.. 채쟁쟁 챙챙
전투 종료

전투 시작
슝.. 쐐액.., 최종 병기
전투 종료

출처

디자인 패턴에 뛰어들기
스프링 입문을 위한 객체지향의 원리와 이해

profile
하루하루 성실하게, 인생 전체는 되는대로.
post-custom-banner

0개의 댓글