[디자인 패턴] 템플릿 메소드(Template method) 패턴
기타

[디자인 패턴] 템플릿 메소드(Template method) 패턴

템플릿 메소드(Template method) 패턴이란?

템플릿 메소드 패턴은 행위패턴 중 하나로, 전체 구조에서 공통적인 부분을 제외한 특정 작업을 처리하는 일부분만 서브 클래스에서 각각 재정의하는 패턴이다. 간단하게 예시를 들어 말하자면, A와 B라는 작업이 있으면 추상 클래스에 알고리즘의 공통되는 부분은 구현을 해놓고 A, B 각각이 다른 작업은 추상 메소드로 재정의하는 것이다.

출저) https://refactoring.guru/design-patterns/template-method

위의 이미지를 보면 상위 클래스에 step1~4를 실행하는, 즉 골격을 잡는 templateMethod()가 있고 이 클래스를 상속받는 ConcreteClass1, ConcreteClass2는 step1~4 중 필요한 것만 오버라이드 해서 재정의하고 있다.


템플릿 메소드 패턴의 장단점?

장점

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

단점

  • 추상 메소드가 많아지면서 클래스 관리가 복잡해진다.
  • 클래스간의 관계와 코드가 꼬여버릴 염려가 있다.
  • 어떤 클라이언트는 알고리즘의 제공된 골격에 맞지 않을 수 있다. (슈퍼클래스의 templateMethod에서 골격을 제한하기 때문)
  • 서브클래스를 통한 default step 구현을 막음으로써 Liskov Substitution Principle(LSP, 리스코프 치환원칙: 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 함)을 위반할 수 있다.

언제 사용하면 좋을까?

  1. 서브 클래스가 알고리즘의 전체 구조가 아닌 특정 스텝만 상속받게 하고 싶을때
    • 템플릿 메소드 패턴은 모놀리틱(monolithic)한 알고리즘을 좀더 세부적인 스텝으로 나누게 만들어주기 때문에 서브 클래스가 슈퍼클래스의 전체적인 구조는 건들지 않고 상속받을 수 있게 해준다!
  2. 일부만 다르고 거의 일치하는 알고리즘을 가진 여러개의 클래스가 있을 때
    • 템플릿 메소드 패턴으로 설계하면 서로 다른 부분은 서브 클래스에 남기면서 비슷한 구현은 슈퍼클래스로 올리면서 코드 중복을 피할 수 있다.

예시

학교 & 회사 이렇게 객체가 2개 있다면 학교를 가고 회사를 가는 로직에는

공통되는 부분은 '일어난다', '씻는다'가 있고

서로 다른 부분은 '버스를 타고 간다' vs '자차를 타고 간다' 라고 했을 때 구현은 다음과 같다.

 

공통적인 로직을 묶는 추상 클래스

public abstract Destination {
    public void goDestination() {
    	wakeUp();
        wash();
        go();
    }
    
    public void wakeUp() {
    	System.out.println("아침에 일어난다.");
    }
    
    public void wash() {
    	System.out.println("샤워를 한다.");
    }
    
    // 서로 다른 로직은 추상 메소드로 정의
    public abstract void go();
}

 

학교 클래스

public class School extends Destination {
    @Override
    public void go() {
    	System.out.println("버스를 타고 간다.");
    }
}

 

회사 클래스

public class Company extends Destination {
    @Override
    public void go() {
    	System.out.println("자차를 타고 간다.");
    }
}

 


Reference

https://coding-factory.tistory.com/712

https://refactoring.guru/design-patterns/template-method

728x90
반응형

'기타' 카테고리의 다른 글

CQRS(Command Query Responsibility Segregation) 패턴  (0) 2022.08.12
[Git] github 간단한 명령어 정리  (0) 2019.12.02