[Java] 16. 복습해보기 - GameLevel
추상 클래스와 템플릿 메서드
Player가 있고 Player는 GameLevel 속성을 가집니다. 각 GameLevel 단계 마다 run(), jump(), turn() 세 가지 기능이 업그레이드 됩니다.
초보자 레벨 : 천천히 달립니다. run() 만 가능
중급자 레벨 : 빠르게 달리고, 점프할 수 있습니다. run(), jump() 가능
고급자 레벨 : 엄청 빠르게 달리고, 높게 점프하고, 턴할 수 있습니다. run(), jump(), turn() 가능
Player는 한번에 하나의 레벨 상태만을 가질 수 있습니다.
Player가 play() 중에 레벨에 있는 go(int count) 라는 메서드를 호출하면 run() 하고 count 횟수 만큼 jump() 하고 turn() 합니다. 다음 클래스 다이어그램을 참고하여 각 레벨에서 go() 가 호출 될때 다음과 같이 출력 되도록 하세요.
- PlayerLevel.java
package com.ch16;
public abstract class PlayerLevel {
public abstract void run();
public abstract void jump(int i);
public abstract void turn();
public abstract void showLevelMessage();
final public void go(int num) {
run();
jump(num);
turn();
showLevelMessage();
}
}
1. PlayerLevel 라는 추상 클래스를 생성 후, run, jump, turn, showLevelMessage를 추상메서드로 생성한다.
2. go(int)를 통해서 run, jump, turn, showLevelMessage를 출력함.
-Player.java
package com.ch16;
public class Player{
private PlayerLevel level;
public Player() {
level = new BeginnerLevel();
}
public PlayerLevel getLevel() {
return level;
}
public void upgradeLevel(PlayerLevel level) {
this.level = level;
}
public void play(int i) {
level.go(i);
}
}
1. Player를 생성할 때 BeginnerLevel()로 생성한다.
2. private 한 속성인 level을 getLevel 이라는 메서드로 값을 가져온다.
3. upgradeLevel메서드는 PlayerLevel 타입의 level 변수로 값을 변경한다.
4. play 메서드를 통해 level 객체의 go 메서드를 실행시킨다.
- BeginnerLevel.java
package com.ch16;
public class BeginnerLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("Slow run");
}
@Override
public void jump(int i) {
System.out.println("Can not jump");
}
@Override
public void turn() {
System.out.println("Can not turn");
}
@Override
public void showLevelMessage() {
System.out.println("********* 초급자 레벨입니다 **********");
}
}
- AdvancedLevel.java
package com.ch16;
public class AdvancedLevel extends PlayerLevel {
@Override
public void run() {
System.out.println("Fast run");
}
@Override
public void jump(int i) {
for (int j=0; j<i; j++) {
System.out.println("High jump");
}
}
@Override
public void turn() {
System.out.println("Can not turn");
}
@Override
public void showLevelMessage() {
System.out.println("********* 중급자 레벨입니다 **********");
}
}
- SuperLevel.java
package com.ch16;
public class SuperLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("So Fast run");
}
@Override
public void jump(int i) {
for (int j=0; j<i; j++) {
System.out.println("Very High jump");
}
}
@Override
public void turn() {
System.out.println("turn");
}
@Override
public void showLevelMessage() {
System.out.println("********* 고급자 레벨입니다 **********");
}
}
1. 추상클래스를 extends 했기 때문에 추상메서드들을 Overriding하여 완성시켜 주어야 한다.
2.Biginner, Advanced, Super Level에 각각 알맞는 값들을 출력해준다.
테스트코드를 만들어 실행시킨다.
-PlayerTest.java
package com.ch16;
public class PlayerTest {
public static void main(String[] args) {
Player player = new Player();
player.play(1);
AdvancedLevel aPlayer = new AdvancedLevel();
player.upgradeLevel(aPlayer);
player.play(2);
SuperLevel sPlayer = new SuperLevel();
player.upgradeLevel(sPlayer);
player.play(3);
}
}
처음 Player 생성자를 호출할 때 BeginnerLevel로 생성하였기 때문에 player객체의 play메서드를 실행하면 BeginnerLevel에 대한 값이 호출된다.
그 후 AdvancedLevel 의 생성자로 객체를 생성하고, player 객체의 level을 upgradeLevel 메서드를 통해서 셋팅한다.
반복해서 SuperLevel 의 객체를 생성해서 마찬가지로 셋팅해준다.