티스토리 뷰

728x90
반응형

템플릿 메서드 패턴이란?


  • 변하는 기능과 변하지 않는 기능을 분리하여 설계를 하는 것이라고 생각합니다.
  • 휴대폰의 잠금 장치를 해제하는 행위은 각 사용자마다 다릅니다. 하지만 잠금 장치를 해제하기 위해서 휴대폰 화면을 키는 행위는 모든 사용자가 하는 행위입니다. 여기서 위에 말한거처럼 변하는 기능과 변하지 않는 기능을 두고 봤을때 장금 장치를 해제하는 행위는 변하는 기능이고 휴대폰 화면을 키는 행위는 변하지 않는 기능입니다.

 

 

 

템플릿 메서드 패턴을 적용하지 않은 예제


  • 아래 예제를 보면 Boy 객체와 Girl 객체는 휴대폰의 암호를 해지하는 방법을 제외하고는 화면을 키는 행위는 동일하며 코드 수정시 2개의 코드를 수정해야하는 번거로움이 있습니다.
public class Boy {
    public void screenOn(){
        System.out.println("휴대폰의 화면을 킵니다.");
        System.out.println("안면 인식 방법으로 암호를 해지합니다.");
        System.out.println("전화를 겁니다.");
    }
}

public class Girl {
    public void screenOn(){
        System.out.println("휴대폰의 화면을 킵니다.");
        System.out.println("비밀번호 방법으로 암호를 해지합니다.");
        System.out.println("전화를 겁니다.");
    }
}

public class Example {

    @Test
    void execute(){
        Boy boy = new Boy();
        boy.screenOn();

        Girl girl = new Girl();
        girl.screenOn();
    }
}

 

Example 실행 결과

 

템플릿 메서드 패턴을 적용한 예제


  • Phone이라는 추상 클래스를 만들어 화면을 키는 행위는 변하지 않는 행위이므로 하나의 메서드로 만들고 암호를 해지하는 행위는 각 사용자마다 달라지므로 상속을 받아 재정의할 수 있는 형태로 다형성을 부여합니다.
public abstract class Phone {

    // 화면을 키는 행위 => 변하지 않는 기능
    public void screenOn(String method){
        System.out.println("휴대폰의 화면을 킵니다.");
        passwordRelease(method);
        System.out.println("전화를 겁니다.");
    }

    // 암호를 해지하는 행위 => 사용자마다 변하는 기능
    protected abstract void passwordRelease(String method);
}

public class Boy extends Phone{

    @Override
    protected void passwordRelease(String method) {
        System.out.println(method + " 방법으로 암호를 해지합니다.");
    }
}

public class Girl extends Phone{

    @Override
    protected void passwordRelease(String method) {
        System.out.println(method + " 방법으로 암호를 해지합니다.");
    }
}

public class Example {

    @Test
    void execute(){
        Boy boy = new Boy();
        boy.screenOn("안면 인식");

        Girl girl = new Girl();
        girl.screenOn("비밀번호");
    }
}

 

Example 실행 결과

 

템플릿 메서드 패턴의 장단점


장점
  • 코드의 중복을 줄일 수 있습니다.
  • 중복을 줄여 유지보수가 쉽습니다.
  • 단일 책임 원칙(SRP)이 이루어 집니다.
단점
  • 자바는 다중 상속을 허용하지 않기 때문에 다른 클래스를 상속받아야 하는 필요성이 있는 경우 힘듭니다.
  • 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합되는 문제가 있습니다.
  • 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않더라고 부모 클래스를 알아야 하므로 좋은 설계가 아니고 또한 잘못된 의존 관계로 인해 부모 클래스의 수정이 발생하면 자식 클래스에도 영향을 줄 수 있습니다.

 

 

728x90
반응형