제 홈페이지의 모든 글은 anti-nhn license에 따릅니다.



자바 디자인 패턴 6 - Strategy

1. Strategy 패턴은..

Template Method 패턴이 상속을 이용해서 어떤 구현을 했다면, Strategy 패턴은 구성을 이용합니다. Template Method와 마찬가지로 바뀌는 부분과 바뀌지 않는 부분을 나눠서 생각할 수 있습니다. Template Method가 하위 클래스에서 바뀌는 부분을 처리한다면 Starategy는 바뀌는 부분을 인터페이스로 분리하여 처리합니다. 그 인터페이스의 구현체를 바꿈으로서 로직을 변경하는 것입니다. 또 Template Method와 크게 다른 점은 Template Method에서는 외부로 공개되는 것이 Template Method를 가지고 있는 상위 클래스였지만, Strategy에서는 인터페이스를 사용하는 클래스(그 클래스를 Context라고 합니다.)입니다.

2. 예제

------------------------ 상위 인터페이스 --------------------
package ch06_Strategy;

public interface Seller {
    public void sell();
}

------------------------- 인터페이스 구현체1 -----------------
package ch06_Strategy;

public class CupSeller implements Seller {
    public void sell() {
        System.out.println("컵을 팔아요.");
    }
}
------------------------- 인터페이스 구현체2 -----------------
package ch06_Strategy;

public class PhoneSeller implements Seller {
    public void sell() {
        System.out.println("전화기를 팔아요.");
    }
}
------------------------- 인터페이스 사용하는 클래스 -----------------
package ch06_Strategy;

public class Mart {
    private Seller seller;
    public Mart(Seller seller) {
        this.seller = seller;
    }
    public void order(){
        seller.sell();
    }
}
------------------------- 테스트 클래스 -----------------
package ch06_Strategy;

public class Test {
    public static void main(String[] args) {
        Seller cupSeller = new CupSeller();
        Seller phoneSeller = new PhoneSeller();
        Mart mart1 = new Mart(cupSeller);
        mart1.order();
        Mart mart2 = new Mart(phoneSeller);
        mart2.order();
    }
}

위에서 보시다 시피 테스트 클래스에서는 Seller의 sell()을 호출하지 않습니다. Mart의 order()를 호출합니다. Seller의 메쏘드는 외부로 공개되지 않습니다.
Mart 클래스가 여기서는 외부로 공개되는 Context가 됩니다. Mart는 멤버 변수로 Seller를 가집니다. Mart에서 가지는 Seller를 바꿔치기함으로써 Mart의 order()에서 실제 실행되는 로직이 달라질 수 있습니다.

3. Strategy의 유용성

예제에서는 Context 클래스가 한 개의 Strategy 인터페이스만을 가집니다. Seller 외에 여러가지 인터페이스를 가질 수도 있습니다. 예를 들어 만드는 사람, 운반하는 사람, 파는 사람은 각각 다를 수 있습니다. 예제에서는 코드를 줄이기 위해 파는 사람만 2가지 종류의 클래스를 만들었습니다. 그러나, 만드는 사람 인터페이스와 운반하는 사람 인터페이스 등을 만들고 그 구현체 들을 만들면, 상당히 다양한 로직이 나올 수 있습니다. 만드는 사람의 구현체가 3종류, 운반하는 사람의 구현체가 3종류, 파는 사람의 구현체가 3종류라하면, 만들어서 운반해서 파는 로직은 총 3*3*3= 27가지가 나옵니다. 이를 상속을 이용한 클래스를 제작하면, 27가지의 구현체가 필요합니다. Strategy를 쓰면, 9개의 구현체만 필요하며, 또 인터페이스를 이용한 프로그램이 가능합니다.


4. JAVA API에 있는 Strategy

java.util.Collections 에 sort(List<T> list, Comparator<? super T> c) 라는 메쏘드가 있습니다. List를 Comparator에서 지정한 방법으로 정렬하는 메쏘드입니다. Comparator는 compare(T o1, T o2) 메쏘드 하나만 있는 인터페이스 입니다. 이 인터페이스를 구현하는 방법에 따라서 정렬된 결과가 달라집니다. "101"이 먼저일까요, "11"이 먼저일까요? 일반적인 순서에서는 "101"이 먼저입니다. 그러나 이게 숫자라면, 정렬 방법이 달라져야 합니다. Comparator를 구현함으로써 해결할 수 있습니다.

by 삼실청년 | 2007/10/04 18:44 | 컴터질~ | 트랙백 | 핑백(2) | 덧글(6)

트랙백 주소 : http://iilii.egloos.com/tb/3826810
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at java design patt.. at 2017/05/31 09:25

... 6. 자바 디자인 패턴 6 – Strategy</A> 7. 자바 디자인 패턴 7 – Composite 8. 자바 디자인 패턴 8 – Decorator 9. 자바 디자인 패턴 9 <a href="http://blog.sina.com.cn/s/blog_8e40db350102wt27.html">港股开户 &#8211; Chain of Responsibility ... more

Linked at 자바 디자인 패턴 종류 &#8.. at 2017/09/26 09:15

... ry Method 4. 자바 디자인 패턴 4 &#8211; Template Method 5. 자바 디자인 패턴 5 – Singleton 6. 자바 디자인 패턴 6 – Strategy 7. 자바 디자인 패턴 7 – Composite 8. 자바 디자인 패턴 8 – Decorator 9. 자바 디자인 패턴 9 &# ... more

Commented by jinwoo at 2012/06/14 00:31
형님 안녕하세요.
잘 지내시나요??
요새 기존 시스템 빌링을 띁어 고칠려고 폼잡고 있어요.
어떤 패턴을 쓰는게 가장 좋을까요?
패턴을 시작한지 얼마 안되서 아직 응용이 잘 안되요..

Paypal, Mobile Billing, 신용카드 등을 예정하고 있구요.
결재전 처리, 결재 처리, 후처리 등의 비슷한 프로세스가 있어요.
패턴을 이용하면 좋을 것 같은데..
Template Method 또는 Adapter 패턴을 생각하고 있는데 가장 접합한게 무엇일까요?
Commented by 삼실청년 at 2012/06/16 23:53
글쎄다~~ 자세한 내용을 알아야 대답을 할 수 있을 것 같은데...
template method가 제일 적합할 것 같긴 하다만.. 걔가 유연성이 좀 떨어져서..
게다가 1번의 구매에 대해서 2가지 이상의 결제가 가능하면 또 이래저래 복잡해져..(10,000원 짜리 구입에 5,000원은 카드, 5,000원은 포이트 같이 섞는 경우..)

template method + chain of responsibility + facade 정도면 대충 답이 나올 거 같긴해..
Commented by youryour at 2012/10/09 09:04
Strategy 유용성 덕분에 명쾌하게 이해하였습니다
감사합니다
Commented by 삼실청년 at 2012/11/19 16:59
도움이 되셨으면 좋겠어요.^^ 찾아주셔서 감사합니다.
Commented by wow at 2013/02/13 10:51
진짜 설명 잘하십니다 감사합니당
Commented by 삼실청년 at 2013/05/06 05:54
정확히는 기억이 안 나지만 저것도 쓰는데 한 며칠 걸렸던 글인 거 같네요. 뜯어고치고 고치고 고치다 보니 그래도 좀 나아졌나 보네요. 누군가한테 코털만치라도 도움이 되는 인간이 된 듯해서 뿌듯합니다. 감사합니다.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶