Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

하위 클래스 위임 - Template Method 본문

Java/디자인 패턴

하위 클래스 위임 - Template Method

Seung__ 2021. 11. 7. 22:45

1. Template Method Pattern??


  • 상위 클래스에서는 전체적인 흐름을 구현하고 구체적인 처리는 하위 클래스에 위임.

 

 

 

2. 의도와 동기

  • Operation에 알고리즘의 기본 골격 구조를 정의하고, 구체적인 단계는 서브클래스에서 정의한다.
    --> 프레임워크에서 자주 쓰는 이유
  • 추상화된 함수를 통해서 알고리즘의 일부 단계를 정의함으로써 template method의 처리 순서를 정할 수 있다.

 

 

 

3. Class Diagram


 

 

 

4. 객체 협력 (collaborations)


  • AbstractClass
    • 서브 클래스들이 반드시 구현해야 하는 알고리즘 처리 단계 내의 기본 오퍼레이션이 무엇인지를 정의한다.
    • 서브 클래스에서 이들 오퍼레이션들을 구현한다.
  • ConcreteClass
    • 상위 클래스에서 선언된 추상 메서드를 구현하거나 이미 구현된 메서드를 재정의한다

 

 

5. 중요한 결론 (consequence)


  • 템플릿 메소드는 코드 재사용을 위한 기본 기술
  • 프레임워크에서 가장 많이 사용되는 패턴 중 하나
  • 클래스의 공통부분을 분리하는 기능 제공
  • 템플릿 메서드에서 사용하는 오퍼레이션들
    • AbstractClass 에 정의된 오퍼레이션 중 구체적인 알고리즘을 가지고 있는 오퍼레이션
    • 훅 오퍼레이션 : 부가적인 기능을 추가할 수 있다.  다만 필수는 아님
      • 추상 클래스에 abstract로 메서드 선언 안하면 됨.
      • 만약 abstract로 선언 하면 concrete class에서 반드시 구현해야 함.
    • 기본 오퍼레이션으로 추상화된 오퍼레이션
    • ConcreteClass 오퍼레이션이나 클라이언트 클래스에 정의된 오퍼레이션

 

 

 

6. 예제


  • Player Level
    • 추상 메서드를 선언하고 메서드의 흐름은 추상 클래스에서 정의함.
    • 흐름은 구체 클래스에서 변경하지 못함.
    • 다만 각 메서드의 구현은 구체 클래스에서 진행.
    • fly()는 구체 클래스에서 구현할 수도 안할 수도 있는 메서드이다.
      따라서 abstract로 선언하지 않는다. abstract로 선언하면 구체 클래스에서 반드시 구현해야 한다.
public abstract class PlayerLevel {

    public abstract void run();
    public abstract void jump();
    public abstract void turn();
    public abstract void showLevelMessage();

    //hook operation
    public void fly(){};

    final public void go(int count){

        run();
        for (int i=0;i<count; i++){
            jump();
        }
        turn();
    }
    
}
  • PlayerLevel 추상 클래스에서 선언한 추상 메서드를 구현.
public class BeginnerLevel extends PlayerLevel {
    @Override
    public void run() {
        System.out.println("천천히 달려");
    }

    @Override
    public void jump() {
        System.out.println("점프는 아직..");
    }

    @Override
    public void turn() {
        System.out.println("turn도 아직..");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("초보자...............");
    }
}
  • SuperLevel
    • 해당 level에서만 fly를 구현.(훅 오퍼레이션)
public class SuperLevel extends PlayerLevel {
    @Override
    public void run() {
        System.out.println("빨리 달려");
    }

    @Override
    public void jump() {
        System.out.println("점프 할 줄 알어.");
    }

    @Override
    public void turn() {
        System.out.println("turn도 할줄 알어");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("Super...............");
    }

    @Override
    public void fly() {
        System.out.println("화성 갈끄니까");
    }
}
  • 사용
public class MainBoard {

    public static void main(String[] args) {
        Player player = new Player();

        player.play(1);
        System.out.println("==========");

        PlayerLevel advancedLevel = new AdvancedLevel();
        player.upgradeLevel(advancedLevel);
        player.play(1);
        System.out.println("==========");

        PlayerLevel superLevel = new SuperLevel();
        player.upgradeLevel(superLevel);
        player.play(1);
        System.out.println("==========");
    }
}
초보자...............
천천히 달려
점프는 아직..
turn도 아직..
==========
Advanced...............
천천히 달려
점프 할 줄 알어.
turn도 아직..
==========
Super...............
빨리 달려
점프 할 줄 알어.
turn도 할줄 알어
==========

 

 

  • 이처럼 Template Method Pattern은 추상 클래스에서 메서드의 처리 순서를 정의하고,
    각 메서드는 하위 클래스에서 별도로 구현할 수 있다.

 

 

7. GitHub : 211107 Template Method Pattern


 

GitHub - bsh6463/designPattern

Contribute to bsh6463/designPattern development by creating an account on GitHub.

github.com

 

Comments