위의 예제는 PlayerLevel를 상위 클래스로 하여 3가지 하위 레벨 클래스를 가지고 있고 Player가 PlayerLevel을 사용하게 되는 구조를 가지고 있고 그것을 관계도로 표현하면 다음과 같습니다.
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을 abstract 클래스로 선언하고 하위클래스에서 공통으로 사용될 run(),jump(),turn(),showLevelMessage();를 abstract메서드로 작성합니다.
PlayerLevel클래스에 메서드들을 어떤순서로 작동시킬지 정의한 템플릿 메서드 go()를 작성하고 jump는 for문을 통해 입력횟수만큼 반복되도록 합니다.
public class BeginnerLevel extends PlayerLevel{
public void run() {
System.out.println("천천히 달립니다");
}
public void jump() {
System.out.println("Jump 못하지롱");
}
public void turn() {
System.out.println("turn 못하지롱");
}
public void showLevelMessage() {
System.out.println("******** 초급자 레벨입니다 ********");
}
}
BeginnerLevel 클래스를 작성하고 abstract 메서드들에 출력문을 작성합니다. 아래의 Advanced클래스와 SuperLevel클래스도 해당 레벨에 맞게 작성해줍니다.
public class Advanced extends PlayerLevel {
public void run() {
System.out.println("빨리 달립니다");
}
public void jump() {
System.out.println("높이 Jump 합니다");
}
public void turn() {
System.out.println("turn 못하지롱");
}
public void showLevelMessage() {
System.out.println("******** 중급자 레벨입니다 ********");
}
}
public class SuperLevel extends PlayerLevel {
public void run() {
System.out.println("엄청 빨리 달립니다");
}
public void jump() {
System.out.println("아주 높이 Jump 합니다");
}
public void turn() {
System.out.println("turn 합니다");
}
public void showLevelMessage() {
System.out.println("******** 고급자 레벨입니다 ********");
}
}
public class Player {
//1번
private PlayerLevel level;
public Player() {
level = new BeginnerLevel();
level.showLevelMessage();
}
public PlayerLevel getLevel() {
return level;
}
public void setLevel(PlayerLevel level) {
this.level = level;
}
//2번
public void upgradeLevel(PlayerLevel level) {
this.level = level;
level.showLevelMessage();
}
public void play(int count) {
level.go(count);
}
}
1번 : Player 클래스를 작성하고 PlayerLevel을 자료형으로 하는 level변수를 선언하고 Player 생성자를 만들면서 level에 New BeiginnerLevel 인스턴스를 생성해서 대입하고 shoLevelMessage()메서드를 사용해 현재 레벨을 출력 합니다.. prviate 변수인 level을 읽고 쓰기 위한 get/set 메서드도 추가합니다
2번 : upgradeLevel()메서드를 작성하고 새로운 level을 입력하면 지금 있는 멤버변수 level에 대입하고 showLevelMessage()메서드를 사용해 현재 레벨을 출력합니다.
public class PlayerTest {
public static void main(String[] args) {
//1번
Player player = new Player();
player.play(1);
//2번
PlayerLevel aLevel = new Advanced();
player.upgradeLevel(aLevel);
player.play(2);
PlayerLevel sLevel = new SuperLevel();
player.upgradeLevel(sLevel);
player.play(3);
}
}
//결과
******** 초급자 레벨입니다 ********
천천히 달립니다
Jump 못하지롱
turn 못하지롱
******** 중급자 레벨입니다 ********
빨리 달립니다
높이 Jump 합니다
높이 Jump 합니다
turn 못하지롱
******** 고급자 레벨입니다 ********
엄청 빨리 달립니다
아주 높이 Jump 합니다
아주 높이 Jump 합니다
아주 높이 Jump 합니다
turn 합니다
1번 Player 생성자를 통해 player를 생성하고 plya()메서드를 사용해 BegginerLevel에서의 플레이를 실행시봅니다.
2번 레벨 업그레이드를 위해 PlayerLevel 타입으로 Advnaced 인스턴스를 생성하여 upgradeLevel()메서드를 통해 level에 대입합니다. 그후 play()메서드를 사용하면 중급자 레벨로 플레이하는 것을 볼 수 있습니다. SuperLevel도 동일하게 업그레이드하고 플레이 할 수 있습니다.