템플릿/콜백 패턴은 간단한 정의로는 중복되는 코드들을 인터페이스등을 통한 추출로 인하여 코드의 간결함과 효율성을 높이는 데 있다고 한다.

여기 예제에서는 파일입출력시 try/catch/finally등 자원반납에 관해서 모든 메소드가 중복되고 있다.

그래서 그 부분을 빼고자 하는 것이다.

암튼 적용한 다음의 소스는 다음과 같다. 
(참고 : @Before는 junit실행시 서론, @Test는 본론, @after는 결론) 

JUnit는 main메소드가 없어도 테스트를 실행함..^^

CalcSumTest.java

public class CalcSumTest {
Calculator calculator;
String filepath;
@Before public void setUp(){
calculator = new Calculator();
filepath = getClass().getResource("numbers.txt").getPath();
}
@Test public void sumOfNumber() throws IOException{
int sum = calculator.calcSum(filepath);
System.out.println(sum);
assertThat(sum,is(10));
}
}

그리고 템플릿 메소드와 계산메소드가 있는 계산 클래스
public class Calculator {
public Integer calcTemplete(String filepath,BufferedReaderCallback callback) {
BufferedReader br = null;
int result = 0;
try {
   br = new BufferedReader(new FileReader(filepath));
 
   result = callback.doSomethingWithReader(br);
} catch (IOException ie) {
// TODO: handle exception
ie.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
if(br!=null){
try {
br.close();
} catch (Exception e2) {
// TODO: 무시
}
}
}
return result;
}
public Integer calcSum(String filepath){
BufferedReaderCallback callback = 
new BufferedReaderCallback(){
@Override
public Integer doSomethingWithReader(BufferedReader br){
// TODO Auto-generated method stub
int sum = 0;
try {
String line = "";
while( (line = br.readLine()) != null ){
sum += Integer.parseInt(line);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return sum;
}
};
return calcTemplete(filepath,callback);
}
}

그리고 콜백 인터페이스

public interface BufferedReaderCallback {
Integer doSomethingWithReader(BufferedReader br);
}

그럼 만약 곱하기를 추가한다고 가정하면 어떻게 하면 될까?

참 간단해진다.

우선 테스트 코드 하나 넣고
@Test public void mutiplyOfNumber() throws IOException{
int multiply = calculator.calcMultiply(filepath);
assertThat(multiply,is(24));
}

그다음 SUM이랑 비슷한 메소드만 카피 앤 패스트 하면 된다.
public int calcMultiply(String filepath) {
// TODO Auto-generated method stub
BufferedReaderCallback callback = 
new BufferedReaderCallback(){
@Override
public Integer doSomethingWithReader(BufferedReader br){
// TODO Auto-generated method stub
int multiply = 1;
try {
String line = "";
while( (line = br.readLine()) != null ){
multiply *= Integer.parseInt(line);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return multiply;
}
};
return calcTemplete(filepath,callback);
}


+ Recent posts