본문으로 바로가기

템플릿 메서드

category Java 2020. 6. 17. 00:25

오늘은 템플릿 메서드에 대해 적어봤습니다.

템플릿 메서드는 반드시 실행되야되는 순서를 명시한 것인데요. 만약에 어떤 사람이 뛴다면

달리고 그다음 점프를 하고 턴동작을 하는 것에 대한 순서를 정해놓은 것입니다.

이것을 인터페이스에 명시를 해놓고 다른 클래스들이 상속을 받는 다면 메인 메서드에서 실행을 할 때 그 순서에 따라서 함수가 작동한다는 것을 알 수 있을 것입니다. 다른 클래스들과 같은 동작을 해야 되는 것이 있다면 템플릿 메서드로 구현을 하는 것이 코드의 중복성을 줄일 수 있습니다.

 


package com.templete;

public abstract class Playerlevel {
    public abstract void run();
    public abstract void jump();
    public abstract void turn();
    public abstract void showLevelMessage();

    final public void go(int count){
        run();
        for(int i = 0; i<count; i++){
            jump();
        }
        turn();
    }
}

먼저 playerlevel이라는 인터페이스를 만들어 줍니다. 이때 final 메서드로 추상메서드의 동작 순서를 명시해 줍니다.

 


public class BeginnerLevel extends Playerlevel {

    @Override
    public void run() {
        System.out.println("천천히 달립니다.");
    }

    @Override
    public void jump() {
        System.out.println("jump 못하지롱");
    }

    @Override
    public void turn() {
        System.out.println("turn 못하지롱");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("********* 초급자레벨 입니다. *********");
    }
}


public class AdvancedLevel extends Playerlevel {
    @Override
    public void run() {
        System.out.println("빨리 달립니다.");
    }

    @Override
    public void jump() {
        System.out.println("jump 높게 뜁니다.");
    }

    @Override
    public void turn() {
        System.out.println("turn 못하지롱");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("********* 중급자레벨 입니다. *********");
    }
}

public class SuperLevel extends Playerlevel {
    @Override
    public void run() {
        System.out.println("아주 빨리 달립니다.");
    }

    @Override
    public void jump() {
        System.out.println("jump 높이 뜁니다.");
    }

    @Override
    public void turn() {
        System.out.println("turn 합니다.");
    }

    @Override
    public void showLevelMessage() {
        System.out.println("********* 고급자레벨 입니다. *********");
    }
}

 

그다음 playerlevel 인터페이스를 상속받는 클래스들을 생성해주고 주체가 되는 player클래스를 만들겠습니다.

 

public class Player {
    private Playerlevel level;

    public Player(){
        level = new BeginnerLevel();
        level.showLevelMessage();
    }

    public Playerlevel getLevel(){
        return level;
    }

    public void upgradeLevel(Playerlevel level){
        this.level = level;
        level.showLevelMessage();
    }

    public void play(int count){
        level.go(count);
    }
}

이런 식으로 플레이어에서 인터페이스 객체를 생성해 go 메서드를 play 안에서 실행시킬 수 있게 만들고 메인 메서드에서 실행시켜 보겠습니다.

 

public class MainBoardPlay {
    public static void main(String[] args) {
        Player player = new Player();
        player.play(1);

        AdvancedLevel alevel = new AdvancedLevel();
        player.upgradeLevel(alevel);
        player.play(2);

        SuperLevel sLevel = new SuperLevel();
        player.upgradeLevel(sLevel);
        player.play(3);
    }
}
********* 초급자레벨 입니다. *********
천천히 달립니다.
jump 못하지롱
turn 못하지롱
********* 중급자레벨 입니다. *********
빨리 달립니다.
jump 높게 뜁니다.
jump 높게 뜁니다.
turn 못하지롱
********* 고급자레벨 입니다. *********
아주 빨리 달립니다.
jump 높이 뜁니다.
jump 높이 뜁니다.
jump 높이 뜁니다.
turn 합니다.

Process finished with exit code  

이런 식으로 결과가 나오는 것을 볼 수 있습니다. 인터페이스에서 정의한 순서대로 메서드들이 실행되는 것을 볼 수 있습니다.

'Java' 카테고리의 다른 글

Effective Java item 2  (0) 2021.01.15
Effective Java item 1  (0) 2020.12.22
try ~ with~ resources문  (0) 2020.06.20
For 별찍기 2  (0) 2020.06.12
For문 별찍기1  (0) 2020.06.12