본문 바로가기

Java

람다 표현식을 활용한 디자인패턴 - 전략 패턴

디자인 패턴은 유용하다.

람다 표현식을 디자인 패턴에 적용한다면 더 간결하게 구현할 수 있다.

 

전략패턴

먼저, 다음과 같이 인풋에 대해 유효성을 검증을 전략패턴을 통해 구현할 수 있다.

1
2
3
4
public interface ValidationStrategy {
    boolean validate(String s);
}
 
1
2
3
4
5
6
7
8
9
10
11
public class MyValidator {
    private final ValidationStrategy validationStrategy;
 
    public MyValidator(final ValidationStrategy validationStrategy) {
        this.validationStrategy = validationStrategy;
    }
 
    public boolean validate(String s){
        return validationStrategy.validate(s);
    }
}

 

1
2
3
4
5
6
7
public class IsNumber implements ValidationStrategy {
    @Override
    public boolean validate(final String s) {
        return s.matches("\\d+");
    }
}
1
2
3
4
5
6
public class IsOverFiveLength implements ValidationStrategy {
    @Override
    public boolean validate(final String s) {
        return s.length() > 5;
    }
}
 

위처럼 구현된 전략패턴을 아래 처럼 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
public class Main {
    public static void main(String[] args) {
        String input = "123456";
        MyValidator numberValidator = new MyValidator(new IsNumber());
        System.out.println(numberValidator.validate(input));
 
        MyValidator fiveLengthValidator = new MyValidator(new IsOverFiveLength());
        System.out.println(fiveLengthValidator.validate(input));
    }
}

 

 

하지만 이 경우 ValidationStrategy 를 구현하는, 즉 조건이 많아진다면 조건에 따른 클래스를 또 만들어주어야 하는 수고로움이 발생한다.

이 때 람다 표현식을 사용한다면 그 수고로움을 덜 수 있다.

방법은 다음과 같다.

 

1
2
3
4
public interface ValidationStrategy {
    boolean validate(String s);
}
1
2
3
4
5
6
7
8
9
10
11
public class MyValidator {
    private final ValidationStrategy validationStrategy;
 
    public MyValidator(final ValidationStrategy validationStrategy) {
        this.validationStrategy = validationStrategy;
    }
 
    public boolean validate(String s){
        return validationStrategy.validate(s);
    }
}

 

여기까지는 동일하지만 람다 표현식을 이용하면 구현체를 만들어 줄 필요가 없다.

1
2
3
4
5
6
7
8
9
10
public class Main {
    public static void main(String[] args) {
        String input = "123456";
        MyValidator numberValidator = new MyValidator((String s) -> s.matches("\\d+"));
        System.out.println(numberValidator.validate(input));
 
        MyValidator fiveLengthValidator = new MyValidator((String s) -> s.length() > 5);
        System.out.println(fiveLengthValidator.validate(input));
    }
}

 

만약 검증하고 싶은 (간단한)조건들이 늘어나더라고 위와 같은 방법으로 별도의 클래스 생성없이 구현할 수 있다.

 

 

※ 람다 표현식을 사용하는 것이 항상 좋은 것은 아니다.

경우에 따라 불필요한 코드를 제거할 수 있어서 유용할 수 있고, 기존의 방식을 고수하는 것이 좋을 수 있다.

반응형

'Java' 카테고리의 다른 글

람다 표현식을 활용한 디자인패턴 - 옵저버 패턴  (0) 2020.04.08
람다 표현식을 활용한 디자인패턴 - 템플릿 메서드  (0) 2020.04.08
스트림 활용 정리  (0) 2020.04.04
스트림 기본 정리  (0) 2020.04.04
Optional  (0) 2020.03.29