반응형
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
반응형
'Coding > Java Design Pattern' 카테고리의 다른 글
전략 패턴 (Strategy Pattern) (1) | 2022.12.14 |
---|---|
템플릿 메서드 패턴 (Template Method Pattern) (0) | 2022.12.14 |
추상 팩토리 패턴 (Abstract Factory Pattern) (0) | 2022.12.14 |
팩토리 메서드 패턴 (Factory Method Pattern) (0) | 2022.12.14 |