[Design Pattern]Strategy
1. 개요
Template Method 패턴이 상속을 이용해서 어떤 구현을 했다면, Strategy 패턴은 구성을 이용합니다. Template Method와 마찬가지로 바뀌는 부분과 바뀌지 않는 부분을 나눠서 생각할 수 있습니다. Template Method가 하위 클래스에서 바뀌는 부분을 처리한다면 Starategy는 바뀌는 부분을 인터페이스로 분리하여 처리합니다. 그 인터페이스의 구현체를 바꿈으로서 로직을 변경하는 것입니다. 또 Template Method와 크게 다른 점은 Template Method에서는 외부로 공개되는 것이 Template Method를 가지고 있는 상위 클래스였지만, Strategy에서는 인터페이스를 사용하는 클래스(그 클래스를 Context라고 합니다.)입니다.
2. 예제
// ------------------------ 상위 인터페이스 -------------------- package design.pattern.Strategy; public interface Seller { public void sell(); }
// ------------------------- 인터페이스 구현체1 ----------------- package design.pattern.Strategy; public class CupSeller implements Seller { public void sell() { System.out.println("컵을 팔아요."); } }
// ------------------------- 인터페이스 구현체2 ----------------- package design.pattern.Strategy; public class PhoneSeller implements Seller { public void sell() { System.out.println("전화기를 팔아요."); } }
// ------------------------- 인터페이스 사용하는 클래스 ----------------- package design.pattern.Strategy; public class Mart { private Seller seller; public Mart(Seller seller) { this.seller = seller; } public void order(){ seller.sell(); } }
// ------------------------- 테스트 클래스 -----------------
package design.pattern.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();
}
}
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를 구현함으로써 해결할 수 있습니다.
'개발 > JAVA' 카테고리의 다른 글
[Design Pattern]Composite (0) | 2018.07.16 |
---|---|
[Design Pattern]Composite (0) | 2018.07.16 |
[Design Pattern]Singleton (1) | 2018.07.16 |
[Design Pattern]Template Method (0) | 2018.07.13 |
[Design Pattern]Factory (0) | 2018.07.13 |