배경지식 쌓기 - 템플릿 메소드 패턴

Template Method Pattern

Posted by Yan on November 2, 2021

템플릿 메소드 패턴

어떤 작업을 처리하는 일부분을 서브 클래스로 캡슐화 해 전체 일을 수행하는 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내역을 바꾸는 패턴

  1. 슈퍼 클래스에 기본적인 로직의 흐름을 만든다.
  2. 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로 만든다.
  3. 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용한다.

상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법

  • 변하지 않는 기능은 슈퍼클래스에 만들어두고, 자주 변경되고 확장될 기능은 서브클래스에서 만든다.
  • 슈퍼클래스 : 미리 추상 메소드나 오버라이드 가능한 메소드를 정의해두고 이를 활용해 코드의 기본 알고리즘을 담은 템플릿 메소드를 만든다.

장점 : 재사용성

  • 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메소드의 코드 중복을 최소화할 수 있다.

예시

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 생성 코드
    }
}

템플릿 메소드 패턴과 팩토리 메소드 패턴의 공통적인 장단점

장점

  • 관심사항이 다른 코드를 분리해낼 수 있다.
  • 서로 독립적으로 변경 또는 확장할 수 있다.

단점

  • 상속을 사용한다. 상속의 한계점은 자바 클래스가 다중상속을 허용하지 않는 다는 것.
  • 단지 커넥션 객체를 가져오는 방법을 분리하기 위해 상속구조로 만들어버린다면, 후에 다른 목적으로 상속을 적용하기 어려워진다.
  • 상속을 통한 상하위 클래스의 관계는 생각보다 밀접해서, 상속관계는 여전히 두 가지 다른 관심사에 대해 긴밀한 결합을 허용한다. (슈퍼클래스 내부의 변경이 생길 시, 모든 서브클래스를 수정해야 한다)
reference

[Design Pattern] 템플릿 메서드 패턴이란