템플릿 메소드 패턴
어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화 해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴
- 슈퍼 클래스에 기본적인 로직의 흐름을 만든다.
- 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로 만든다.
- 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용한다.
상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법
- 변하지 않는 기능은 슈퍼클래스에 만들어두고, 자주 변경되고 확장될 기능은 서브클래스에서 만든다.
- 슈퍼클래스 : 미리 추상 메소드나 오버라이드 가능한 메소드를 정의해두고 이를 활용해 코드의 기본 알고리즘을 담은 템플릿 메소드를 만든다.
장점 : 재사용성
- 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메소드의 코드 중복을 최소화할 수 있다.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public abstract class UserDao {
public void add(User user) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
...
}
public User get(String id) throws ClassNotFoundException, SQLException {
Connection c = getConnection();
...
}
public abstract Connection getConnection() throws ClassNotFoundException, SQLException;
}
public class NUserDao extends UserDao {
public Connection getConnection() throws ClassNotFound, SQLException {
// N사 DB connection 생성 코드
}
}
public class DUserDao extends UserDao {
public connection getConnection() throws ClassNotFound, SQLException {
//D사 DB connection 생성 코드
}
}
템플릿 메소드 패턴과 팩토리 메소드 패턴의 공통적인 장단점
장점
- 관심사항이 다른 코드를 분리해낼 수 있다.
- 서로 독립적으로 변경 또는 확장할 수 있다.
단점
- 상속을 사용한다. 상속의 한계점은 자바 클래스가 다중상속을 허용하지 않는 다는 것.
- 단지 커넥션 객체를 가져오는 방법을 분리하기 위해 상속구조로 만들어버린다면, 후에 다른 목적으로 상속을 적용하기 어려워진다.
- 상속을 통한 상하위 클래스의 관계는 생각보다 밀접해서, 상속관계는 여전히 두 가지 다른 관심사에 대해 긴밀한 결합을 허용한다. (슈퍼클래스 내부의 변경이 생길 시, 모든 서브클래스를 수정해야 한다)