JAVA, 추상 클래스&템플릿 메서드 예제
- 동일한 메서드들을 클래스의 상태에 따라 다르게 구현하게 될때 추상 클래스를 사용한다
- 상위(PlayerLevl) 클래스를 핸들링하면 하위 클래스(BeginnerLevel, AdvancedLevel, SuperLevel)를 모두 핸들링 할 수 있다
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("**** 초보자 레벨 입니다 ****");
}
}