이전 포스트 ("http://smile2x.tistory.com/entry/templete-method-%ED%8C%A8%ED%84%B4-2") 에 이은 내용이다.
이번 내용은 스트레티지 패턴인데, 다른 점은 각 객체가 갖어야 할 다른 행동을 갖은 객체로 빼는 것이다.
아래서 주입이라는 단어를 사용하는데, 객체생성할 때 전략객체를 파라미터로 전달하는 것으로 알면 된다. 세가지의 협동? 으로 이루어지는데,
1. 각자 다른 전략(행동) 메소드를 갖는 전략(strategy) 객체
2. 전략 객체를 사용하는 객체 소비자(사용 클래스)
3. 전략 객체를 만들고, 사용객체에 주입하는 클라이언트
흐름 :
행동(전략)을 추상화 하는 interface 를 두고, 사용할 전략(strategy) 객체를 만들때 인터페이스를 통해 객체를 만들게 된다.
해당 interface를 구현하는 구현체(전략 클래스)들을 만든다.
해당 전략객체(인터페이스로 만들어진)를 사용(injection) 하여 객체를 사용한다.
전략행동의 인터페이스 를 만든다.
이번 내용은 스트레티지 패턴인데, 다른 점은 각 객체가 갖어야 할 다른 행동을 갖은 객체로 빼는 것이다.
아래서 주입이라는 단어를 사용하는데, 객체생성할 때 전략객체를 파라미터로 전달하는 것으로 알면 된다. 세가지의 협동? 으로 이루어지는데,
1. 각자 다른 전략(행동) 메소드를 갖는 전략(strategy) 객체
2. 전략 객체를 사용하는 객체 소비자(사용 클래스)
3. 전략 객체를 만들고, 사용객체에 주입하는 클라이언트
흐름 :
행동(전략)을 추상화 하는 interface 를 두고, 사용할 전략(strategy) 객체를 만들때 인터페이스를 통해 객체를 만들게 된다.
해당 interface를 구현하는 구현체(전략 클래스)들을 만든다.
해당 전략객체(인터페이스로 만들어진)를 사용(injection) 하여 객체를 사용한다.
전략행동의 인터페이스 를 만든다.
public interface Strategy { public abstract void runStrategy(); }각 용도별 해당 인터페이스의 구현체를 만들어준다.
public class StrategyGun implements Strategy{ public void runStrategy() { // TODO Auto-generated method stub System.out.println("빵빵, 총"); } } public class StrategySword implements Strategy{ public void runStrategy() { // TODO Auto-generated method stub System.out.println("칼칼칼"); } }만들어진 전략을 사용하는 사용자 클래스를 만든다. interface class의 타입(Strategy) 으로 선언하고 나중에 파라미터는 구현체 타입의 instance 를 전달한다.
public class Soldier { public void run(Strategy strategy){ strategy.runStrategy(); } }아래는 실제 전략을 만들고 컨텍스트(사용클래스에) 주입하는 코드. new StrategyGun() 으로 생성하고, 해당 Strategy를 run 메소드에 주입하고 있다. 이렇게 함으로써 soldier 클래스 행동의 중복을 피하고, 앞으로 추가되는 무기류에 대해 Strategy의 구현체를 만들어주기만 하면 대응이 가능하도록 된 것이다.
public class client { public static void main(String [] args){ Strategy strategy = null; Soldier soldier = new Soldier(); strategy = new StrategyGun(); soldier.run(strategy); strategy = new StrategySword(); soldier.run(strategy); } }
'프로그래밍' 카테고리의 다른 글
Java 메모리 관리(스택프레임) (1) | 2016.06.05 |
---|---|
유니코드와 인코딩에 대하여 (0) | 2016.06.04 |
templete method 패턴 (0) | 2016.05.29 |
git fetch from remote (0) | 2016.04.07 |
특정 주기로 로그 삭제 (0) | 2016.01.05 |