전략 패턴
전략 패턴은 한 유형의 알고리즘을 보유한 상태에서 런타임에 적절한 알고리즘을 선택하는 기법이다.
다양한 기준을 갖는 입력값을 검증하거나, 다양한 파싱 방법을 사용하거나, 입력 형식을 설정하는 등 다양한 시나리오에 전략 패턴을 활용할 수 있다.
우테코 예외처리 코드 전략 패턴으로 해결해보기
우테코 프리코스를 진행하면서 입력값에 대한 예외처리를 하는 것이 상당히 어려웠다. 예외처리를 하기 위한 클래스를 구성하는 것 부터 메소드들의 리턴값 구성 등등 마음에 들게 코딩을 하지 못했다. 모던 자바 인 액션을 읽다가 전략 패턴을 접했는데 전략 패턴으로 입력값 검증을 잘 해낼 수 있을 것 같아서 도전해본다.
전략 패턴 도입 이전 코드
먼저 try-catch문을 사용했다. isLapInt()의 의도는 이렇다.
- 몇 바퀴를 돌것인지 결정하기 위해서 int를 입력받는다.
- int를 입력받았다면 true를 반환하며 메소드를 끝낸다.
- int가 아니라면 InputMismatchException 에러가 발생하며 false를 반환한다.
- false를 반환했다면 isLapInt()를 호출한 함수에서 다시 isLapInt()를 호출한다.
문제점
- 클래스 변수 lap을 유지해야 한다.
- 딱 보기에도 그냥 복잡하다.
- 프로그램에 또 다른 입력값을 검증하기 위해서는 또 다른 try-catch문을 작성해야한다.
전략 패턴 도입 이후
- 전략 패턴을 위한 함수형 인터페이스를 작성한다. (Validation)
- 인터페이스를 구현한다. 필자의 경우에는 입력값이 "," 하나 이거나 숫자인 경우를 검증하는 IsOnlyComma, IsNumeric Class를 구현했다.
- 함수형 인터페이스 Validation을 사용하는 Validator Class를 구현한다.
- 자바의 다형성을 이용해 전략 패턴을 사용한다.
public interface Validation { boolean execute(String s); }
public class IsOnlyComma implements Validation{
@Override
public boolean execute(String s) {
return s.equals(",");
}
}
public class IsNumeric implements Validation {
@Override
public boolean execute(String s) {
return s.matches("\d+");
}
}
public class Validator {
private final Validation validator;
public Validator(Validation validator) {
this.validator = validator;
}
public boolean validation(String s) {
return validator.execute(s);
}
}
# 코드의 변화
Validator validator = new Validator(new IsNumeric());
while(validator.validation(scanner.next()));
위에 try-catch문이 단 두 줄로 끝낼 수 있게 되었다. 전략 패턴이 실무에서 가장 많이 쓰일정도로 많이 사용된다고 하는데 더 많은 연습이 필요할 것 같다.
'자바' 카테고리의 다른 글
[모던 자바 인 액션] 옵저버 패턴 (observer) (0) | 2020.01.05 |
---|---|
[모던 자바 인 액션] 템플릿 메소드 패턴 (template method) (1) | 2020.01.05 |
[모던 자바 인 액션] 리팩터링, 테스팅, 디버깅 (0) | 2020.01.04 |
[모던 자바 인 액션] 자바 병렬처리 (0) | 2020.01.02 |
[모던 자바 인 액션] 스트림 (0) | 2019.12.30 |
최근댓글