템플릿 콜백 패턴 (Template Callback Pattern)

반응형
728x90
반응형
수강완료한 강의 복습해보자
(코딩으로 학습하는 GoF의 디자인 패턴)


템플릿 콜백 (Template-Callback)

  • 콜백으로 상속 대신 위임을 사용하는 템플릿 패턴.
  • 상속 대신 익명 내부 클래스 또는 람다 표현식을 활용할 수 있다.

적용 전 코드 (Before)

FileProcessor.java
public class FileProcessor {

    private String path;
    public FileProcessor(String path) {
        this.path = path;
    }

    public int process() {
        try(BufferedReader reader = new BufferedReader(new FileReader(path))) { // 자동 close
            int result = 0;
            String line = null;
            while((line = reader.readLine()) != null) {
                result += Integer.parseInt(line);
            }
            return result;
        } catch (IOException e) {
            throw new IllegalArgumentException(path + "에 해당하는 파일이 없습니다.", e);
        }
    }
}

 

MultiplyFileProcessor.java
public class MultiplyFileProcessor {

    private String path;
    public MultuplyFileProcessor(String path) {
        this.path = path;
    }

    public int process() {
        try(BufferedReader reader = new BufferedReader(new FileReader(path))) {
            int result = 0;
            String line = null;
            while((line = reader.readLine()) != null) {
                result *= Integer.parseInt(line);
            }
            return result;
        } catch (IOException e) {
            throw new IllegalArgumentException(path + "에 해당하는 파일이 없습니다.", e);
        }
    }
}

 

Client.java
public class Client {

    public static void main(String[] args) {
        FileProcessor fileProcessor = new FileProcessor("number.txt");
        int result = fileProcessor.process();
        System.out.println(result);
    }
}

 

1) 요구사항

number.txt 파일을 읽어서 각 row의 총합을 구하라.

 

2) 문제점

FileProcessor.java 와 MultiplyFileProcessor.java 의 비즈니스 로직을 보면 딱 한줄만 다르고, 모두 중복된다.

// FileProcessor
while((line = reader.readLine()) != null) {
    result += Integer.parseInt(line);
}

...

// MultiplyFileProcessor
while((line = reader.readLine()) != null) {
    result *= Integer.parseInt(line);
}

 

3) 추가요건

number.txt 파일을 읽어서 나눗셈을 수행해라.

DivisionFileProcessor.java 를 추가로 신규 생성한다. 이때도 단 한줄 이외의는 모두 중복코드다.

// DivisionFileProcessor
while((line = reader.readLine()) != null) {
    result /= Integer.parseInt(line);
}

 

 

적용 후 코드 (After)

FileProcessor.java
public abstract class FileProcessor {

    private String path;
    public FileProcessorCallback(String path) {
        this.path = path;
    }

    public final int process(Operator operator) {
        try(BufferedReader reader = new BufferedReader(new FileReader(path))) {
            int result = 0;
            String line = null;
            while((line = reader.readLine()) != null) {
                /** 다른 부분 */
                result = operator.getResult(result, Integer.parseInt(line));
            }
            return result;
        } catch (IOException e) {
            throw new IllegalArgumentException(path + "에 해당하는 파일이 없습니다.", e);
        }
    

}

 

Operator.java
public interface Operator {
    /* template method */
    abstract int getResult(int result, int number);
}

 

Plus.java
public class Plus implements Operator {
   @Override
    public int getResult(int result, int number) {
        return result += number;
    }
}

 

Multiply.java
public class Multiply implements Operator {
   @Override
    public int getResult(int result, int number) {
        return result *= number;
    }
}

 

Client
public class Client {
    public static void main(String[] args) {
        // int result = fileProcessor.process(new Plus());
        int result = fileProcessor.process((result1, number) -> result1 += number);
        System.out.println(result);
    }
}

 

 

위 Before 에서 봤던 추가 요건을 다시 생각해보자.

1) 추가요건

[추가요건]
number.txt 파일을 읽어서 나눗셈을 수행해라.

인터페이스 Operator의 구현클래스를 추가하여 로직을 수행하면 된다.

public class Division implements Operator {
   @Override
    public int getResult(int result, int number) {
        return result /= number;
    }
}

 

또는 Clinet 코드에서 람다식으로 전달할 수 있다.

int result = fileProcessor.process((result1, number) -> result1 /= number);

 

 

github : https://github.com/seohaem/java/tree/master/java_GoFdesignpattern

강의 : https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4

 

 

 

 

반응형

Designed by JB FACTORY