728x90
반응형
템플릿 메서드 패턴(Template Method Pattern)은 알고리즘의 일부 또는 전부를 하위 클래스에서 구현하거나 위임하는 데 사용한다.
공통으로 사용하는 알고리즘은 부모에서 정의한 후, 특정 부분에서 사용하는 알고리즘은 하위 클래스에서 수행하도록 설계하는 것이다.
하위 Stack 클래스는 LinkedList를 사용하여 구현했으며, Stack과 같은 역할을 한다.(LIFO, Last In First Out)
이 Stack 클래스에는 filter 메소드가 존재하며, StackPredicate라는 인터페이스의 isValid를 사용하여 원하는 값만 스택에 담아 반환한다.
public class Stack {
private final LinkedList<Integer> stack;
public Stack(){
this.stack = new LinkedList<>();
}
public Stack(final LinkedList<Integer> initialState){
this.stack = initialState;
}
public void push(final Integer number){
stack.add(0, number);
}
public Integer pop(){
return stack.remove(0);
}
public Stack filter(final StackPredicate filter){
final LinkedList<Integer> initialState = new LinkedList<>();
for(Integer e : stack){
if(filter.isValid(e)){
initialState.add(e);
}
}
return new Stack(initialState);
}
}
public interface StackPredicate {
boolean isValid(int e);
}
Java 8 버전을 사용하니, lamda를 사용해서 구현해보자.
public class StackPredicateTest {
private Stack stack;
@Before
public void createStack(){
stack = new Stack();
for(int i=1; i<=10; i++){
stack.push(i);
}
}
@Test
public void evenPredicate(){
// 짝수만 남게 필터링
final Stack filtered = stack.filter((v)-> (v % 2 == 0));
assertEquals(Integer.valueOf(10), filtered.pop());
assertEquals(Integer.valueOf(8), filtered.pop());
assertEquals(Integer.valueOf(6), filtered.pop());
}
@Test
public void allPredicate(){
final Stack filtered = stack.filter((v) -> true);
assertEquals(Integer.valueOf(10), filtered.pop());
assertEquals(Integer.valueOf(9), filtered.pop());
assertEquals(Integer.valueOf(8), filtered.pop());
}
}
StackPredicate에게 필터링이 어떻게 동작해야 하는지를 코딩하라고 위임한 것
filter메서드에 들어있는 로직은 어떤 값이 걸러져야 하는지 결정하는 부분을 StackPredicate 인퍼테이스의 관련 부분에서 완벽하게 분리를 함
장점
- Stack클래스의 필터 동작을 별도로 지정하더라도 Stack 클래스를 전혀 수정할 필요가 없다.
- StackPredicate 인터페이스를 구현하는 코드는 간단하게 분리되어 있어 Stack 인스턴스 없이도 독립적인 테스트가 가능하다.
728x90
반응형
'그 외 ... (정리해야함) > 질문과 답변' 카테고리의 다른 글
Atomic 클래스는 무엇을 제공하는가? (0) | 2019.05.07 |
---|---|
[동시성] 스레드 사이의 공유 상태는 어떻게 관리하는가? (0) | 2019.05.07 |
JVM에서 동작하는 실제 자바 코드를 작성할 때 생명주기란 무엇인가? (0) | 2019.05.07 |
JVM의 힙 크기는 어떻게 지정할 수 있는가? (0) | 2019.05.07 |
JVM 메모리는 어떻게 할당되는가? (0) | 2019.05.05 |