디자인패턴

템플릿 메소드 패턴 (Template Method Pattern)

Romenest 2021. 9. 23. 09:03

템플릿 메소드 패턴은 작업을 담당하는 일부분을 서브클래스로 캡슐화 하여

전체 구조는 바꾸지 않으면서 세부단계에서 수행할 기능을 바꾸는 패턴이다.

전체적인 틀은 동일하면서 부분적으로 다른 구문을 가진 메소드의 코드중복을 줄여주는 효과를 가지고 있다.

 

클래스로 풀어 말하자면

상위 클래스에서는 공통적인 코드를 가지게 하고

하위 클래스에서는 다양한 코드를 가지게 한다는 것이다.

 

즉,

확장적이고 공통적인것 - 상위 클래스 

그렇지 않은 것           - 하위 클래스 

 

 

템플릿 메소드의 장점으로는

  • 코드 중복을 줄일 수 있다.
  • 자식 클래스의 역할을 줄여 핵심 로직의 관리가 용이하다
  • 좀더 코드를 객체지향적으로 구성할 수 있다.

가 있겠고

 

단점으로는

  • 추상 메소드를 많이 만들면서 클래스 관리가 복잡해질 수 있다
  • 클래스 간 관계가 꼬일 수 있다.

가 있겠다.

 

간단한 예시를 들어 설명해보겠다.

 

주차장, 야외 테라스, 백화점 내부 를 순찰하는 경비원 들이 있다고 하자

이 경비원들이 가질 행동은

주차장 야외 테라스 백화점 내부
go to work ( 출근 )
change dress ( 복장변경 )
patrol park ( 주차장 순찰 )
go to work ( 출근 )
change dress ( 복장변경 )
patrol terrace ( 테라스 순찰 )
go to work ( 출근 )
change dress ( 복장변경 )
patrol department( 백화점 순찰 )

이 되겠다.

 

이 예시를 코딩해보자

abstract class Security{
	
    public void patrol {
       gotowork();
       changedress();
       patrol();
    }
    
    public void gotowork() {
        System.out.println("출근 한다");
    }
    public void changedress() {
        System.out.println("복장을 변경한다");
    }
    
    
    public void patrol();
    
}

여기서 출근한다와 복장을 변경하는 기능은 공통 메소드가 되겠고

순찰을 도는 patrol은 추상 메소드가 되겠다

 

주차장 경비원 기능

class Park_security extends Security{
    
    @Override
    public void patrol() {
        System.out.println("주차장을 순찰합니다.");
    }
}

 

테라스 경비원 기능

class Terrace_security extends Security{
    
    @Override
    public void patrol() {
        System.out.println("테라스를 순찰합니다.");
    }
}

 

백화점 내부 경비원 기능

class Department_security extends Security{
    
    @Override
    public void patrol() {
        System.out.println("백화점 내부를 순찰합니다.");
    }
}

공통메서드를 제외하고 세부적으로 다른기능을 수행할 경우 위와같이 코드를 구성했다.

 

 

실행

public class Main {
    public static void main(String[] args) {
        Park_security park = new Park_security(); // 주차장 순찰
        Terrace_security terrace = new Terrace_security(); // 테라스 순찰
        Department_security department = new Department_security(); // 백화점내부 순찰
        
        park.patrol();
        terrace.patrol();
        department.patrol();
    }
}

 

결과

주차장을 순찰합니다.
테라스를 순찰합니다.
백화점 내부를 순찰합니다.

 

다시한번 간략하게 정리하자면

 

템플릿 메소드 패턴은 

전체적으로는 같은 역할을 하는 메소드지만 조금 수정하여 다른형태로 사용이 필요한 경우 유용하게 사용할 수 있으며

상속을 통해 슈퍼 클래스의 기능을 확장하는데에 용이하다.

변하지않는 틀이 될 기능은 상위 클래스, 즉 슈퍼 클래스에 만들어두고

자주 변경하고, 수정, 확장 해서 사용될 기능은 하위클래스,즉 서브 클래스에 만들어 사용한다고 보면된다.