JAVA, 추상 클래스&템플릿 메서드 예제

  • 동일한 메서드들을 클래스의 상태에 따라 다르게 구현하게 될때 추상 클래스를 사용한다
  • 상위(PlayerLevl) 클래스를 핸들링하면 하위 클래스(BeginnerLevel, AdvancedLevel, SuperLevel)를 모두 핸들링 할 수 있다

template method pratice

MainBoard
package gamelevel;

public class MainBoard {

	public static void main(String[] args) {

		Player player = new Player();
		player.play(1);

		AdvancedLevel aLevel = new AdvancedLevel();
		player.upgradLevel(aLevel);
		player.play(2);

		SuperLevel sLevel = new SuperLevel();
		player.upgradLevel(sLevel);
		player.play(3);

	}
}
Player
package gamelevel;

public  class Player {

	// !!!level 변수는 여러타입을 가질 수 있으므로 상위 클래스의 타입을 갖는다
	private PlayerLevel level;
	/*
	 * PlayerLevel을 참조 하지 않았다면 : 더러워짐
	 private BeginnerLevel level_1;
	 private AdvancedLevel level_2;
	 private SuperLevel level_3;
	 */

	public Player() {
		// Player가 처음 만들어질때
		level = new BeginnerLevel();
		level.showLevelMessage();
	}

	public PlayerLevel getLevel() {
		return level;
	}

	public void upgradLevel(PlayerLevel level) {
		this.level = level;
		level.showLevelMessage();
	}

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

레벨마다 특징이 다르기 때문에 메서드를 추상화 하였다

package gamelevel;

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();
	}
}
gamelevel

레벨마다 PlayerLevel을 상속받아 제정의 했다

package gamelevel;

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("turm 할 줄 모른다");
	}

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

결과

result


Reference

인프런 강좌 Do it! 자바 프로그래밍 입문