템플릿/콜백 패턴은 간단한 정의로는 중복되는 코드들을 인터페이스등을 통한 추출로 인하여 코드의 간결함과 효율성을 높이는 데 있다고 한다.
여기 예제에서는 파일입출력시 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);
}
'스프링프레임워크공부중 > 1부 템플릿 패턴 따라잡기' 카테고리의 다른 글
마지막 5단계 제네릭을 이용한 팩토링 (0) | 2010.12.18 |
---|---|
4단계 템플릿/콜백 패턴으로 재설계하기 (0) | 2010.12.18 |
2단계 자원반납 팩토링 (0) | 2010.12.18 |
1단계 간단한 파일입출력 리펙토링(템플릿/콜백 패턴 사용) (0) | 2010.12.18 |