Springboot

탬플릿 메서드 패턴

25G 2023. 8. 14. 18:06

핵심기능 vs 부가기능

  • 핵심기능 : 해당객체가 제공하는 고유의 기능
  • 부가기능 : 핵심기능을 보조하기 위해 제공되는 기능. 로그추적, 트랜잭션기능등등...

템플릿 메서드 패턴

좋은 설계는 변하는 것과 변하지 않는 것을 분리하는것이다
핵심기능은 변하고 부가기능은 대게 고정돼 있다. 이 둘을 분리해서 모듈화 해야한다.
템플릿 메서드 패턴이 이문제를 해결해 준다.

템플릿 메서드의 구조는 추상 탬플릿안에 로직들을 다 모아놓고 내부 에 변화하는 로직들을 자식 클래스가 오버라이드 해서 구성하는것입니다.
즉 추상클레스 안에 변하지 않는 로직들을을 다 넣어놓고 변하는 로직은 별도로 호출해서 해결하는패턴입니다

public abstract class 추상클레스{

public void ex(){
부가기능코드~~

핵심로직코드() //호출

부가기능코드~~

}

protected abstract void 핵심로직코드();

}

위 추상클래스를 상속받아서 핵심로직코드()를 오버라이딩하면 된다.

이렇게 할 수 있는 이유는 자식클래스에 오버라이딩을 하면 오버라이딩된 함수가 실행되기 때문입니다.
이렇게하면 단일책임원칙도 같이 챙길 수 있다.

익명내부 클래스 활용하기

익명 내부 클래스를 사용하면 객체 인스턴스를 생성하면서 동시에 생성할 클래스를 상속 받은 자식 클래스를 정의할 수 있다.

좋은 설계에 대해서

좋은 설계라는 것에는 수많은 정의가 있지만 진정한 좋은 설계는 바로 변경이 일어날때 자연스럽게 드러난다. 한번에 완벽한 프로그렘을 만들 수 없기때문에 변경이 쉬운 설계가 좋은설계라고 합니다.
단일책임 원칙 을 잘 지키면 변경이 있을때 진가를 발휘한다.

정리

부모클래스에 알고리즘의 골격인 템플릿을 정의하고 일부 변경되는 로직은 자식클래스에 정의하는 것이다. 이렇게 하면 자식클래스가 알고리즘의 전체구조를 변경하지 않고 특정부분만 재정의 할수 있다
단점!
자식클래스가 부모클래스와 컴파일 시점에 강하게 결합되는 단점이 있다.
자식클래스입장에서 부모클래스의 기능을 사용하지 않는데 부모클래스의 무거운 탬플릿 로직을 다 들고있는것이다. 그래서 부모클래스를 강하게의존하게 된다.
즉 부모클래스에 무슨일이 생기면 모든 자식클래스들에 영향을 받기때문에 단점이 명확하다.
이러한 단점을 제거하는 디자인 패턴이 전략패턴이다.