728x90
전략 패턴을 사용하여 메서드 추출을 했을 때보다
유연하고 확장성 있는 코드를 짜는 것은 성공했지만
여전히 필요할 때마다 전략 패턴을 새로 생성해야 하는 것은 그대로다.
또한, 전략에 부가적인 정보가 필요한 경우
이를 위해 생성자와 인스턴스 변수를 추가적으로 만들어야 하는 것도 번거롭다.
로컬 클래스로 사용하기
전략 클래스를 계속해서 생성해야 하는 문제는 전략 클래스를
컨텍스트 클래스에 내부 클래스로 정의하는 것으로 해결할 수 있다.
이러한 전략 클래스들은 컨텍스트 클래스 이외에는 사용되지 않기 때문에
굳이 외부에 클래스로 따로 만들어둘 필요가 없기 때문이다.
public void add(User user) throws SQLException {
// 사용할 컨텍스트 메소드 내부에 클래스 선언
class AddStatement implements StatementStartegy {
// 전략 구현
}
}
기존에 별도의 클래스에 작성되어 있던 코드를 위와 같이 해당 전략을 사용하고자 하는
컨텍스트 메서드 내부에 선언하면 클래스 파일을 추가하는 작업이 사라진다.
또한 해당 컨텍스트 메서드에서 사용되는 멤버들에 접근할 수 있다는 장점도 있기 때문에
생성자를 통해 필요한 오브젝트들을 일일히 생성하는 번거로움이 사라지고
컨텍스트 메서드의 파라미터나 멤버들에 접근해 사용하면 된다.
익명 내부 클래스로 더 간결하게 만들기
특정 컨텍스트 메서드에서만 사용될 전략 클래스이기 때문에
다른 곳에서 호출 할 필요가 없으니 클래스의 이름이 굳이 필요 없다.
public void add(User user) throws SQLException {
jdbcContextWithStatementStrategy(
StatementStrategy st = new StatementStrategy() { // 전략 구현부 }
);
}
어차피 한 번만 사용할 오브젝트니 굳이 변수에 저장할 필요도 없다.
public void add(User user) throws SQLException {
jdbcContextWithStatementStrategy(
new StatementStrategy() { // 전략 구현부 }
);
}
클래스 파일도 줄어들고 코드도 훨씬 간결해졌다.
'Back-End > Spring' 카테고리의 다른 글
템플릿과 콜백 (0) | 2023.06.13 |
---|---|
컨텍스트와 DI (0) | 2023.06.13 |
템플릿 적용하기 (0) | 2023.06.13 |
스프링에 테스트 적용하기 (0) | 2023.06.08 |
JUnit 자세히 알아보기 (0) | 2023.06.08 |