ackage castle;
import java.util.HashMap;
public class Room {
private String description;
HashMap<String,Room> exits = new HashMap<String,Room>();
public Room(String description) {
this.description = description;
}
public void setExit(String dir,Room room) {
exits.put(dir, room);
}
public String getExitdesc() {
StringBuffer sb = new StringBuffer();
for(String dir :exits.keySet()) {
sb.append(dir);
sb.append(" ");
}
return sb.toString();
}
public Room getExit(String dir) {
return exits.get(dir);
}
public String toString() {
return ""+description;
}
}
package castle;
import java.util.Scanner;
public class Game {
private Room currentRoom;
public Game()
{
createRooms();
}
private void createRooms()
{
Room outside, lobby, pub, study, bedroom;
// 製造房間
outside = new Room("城堡外");
lobby = new Room("大堂");
pub = new Room("小酒吧");
study = new Room("書房");
bedroom = new Room("臥室");
// 初始化房間的出口
outside.setExit("east",lobby);
outside.setExit("south",study);
outside.setExit("west",pub);
lobby.setExit("east", outside);
study.setExit("north",outside);
study.setExit("south",bedroom);
bedroom.setExit("west",study);
pub.setExit("down",lobby);
currentRoom = outside; // 從城堡門外開始
}
private void printWelcome() {
System.out.println();
System.out.println("歡迎來到城堡!");
System.out.println("這是一個超級無聊的遊戲。");
System.out.println("如果需要幫助,請輸入 'help' 。");
System.out.println();
System.out.println("現在你在" + currentRoom);
System.out.print("出口有:");
System.out.print(currentRoom.getExitdesc());
}
// 以下爲用戶命令
private void printHelp()
{
System.out.print("迷路了嗎?你可以做的命令有:go bye help");
System.out.println("如:\tgo east");
}
private void goRoom(String direction)
{
Room nextRoom = null;
if(direction.equals("north")) {
nextRoom = currentRoom.getExit("north");
}
if(direction.equals("east")) {
nextRoom = currentRoom.getExit("east");
}
if(direction.equals("south")) {
nextRoom = currentRoom.getExit("south");
}
if(direction.equals("west")) {
nextRoom = currentRoom.getExit("west");
}
if (nextRoom == null) {
System.out.println("那裏沒有門!");
}
else {
currentRoom = nextRoom;
System.out.println("你在" + currentRoom);
System.out.print("出口有: ");
System.out.print(currentRoom.getExitdesc());
System.out.println();
}
}
//public void showPrompt(){
//
//
//
//
//
//
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Game game = new Game();
game.printWelcome();
while ( true ) {
String line = in.nextLine();
String[] words = line.split(" ");
if ( words[0].equals("help") ) {
game.printHelp();
} else if (words[0].equals("go") ) {
game.goRoom(words[1]);
} else if ( words[0].equals("bye") ) {
break;
}
}
System.out.println("感謝您的光臨。再見!");
in.close();
}
}
消除代碼複製
- 代碼複製是不良設計的一種表現
封裝
適用於將來的需要(可以在將來使用)
- 可以運行的代碼!=良好的代碼
- 對代碼做維護的時候最能看出代碼的質量
- 如果想要增加一個方向,如down或up
用封裝來降低耦合
- Room類和Game類都有大量的代碼和出口有相關
- 尤其是Game類中大量的使用了Room類的成員變量
- 類和類之間的關係稱作耦合
- 耦合越低越好,保持距離是形成良好的代碼的關鍵
可擴展性
用藉口來實現聚合
給Room類實現的新方法,吧方向的細節徹底隱藏在Room類內部了
今後的方向如何實現就和外部無關的了
Room 的方向是用成員變量表示的,增加或減少方向就要改變代碼
如果用Hash表來表示,那麼方向就不是“硬編碼”的了
框架加數據
以框架+數據來提高可擴展性
- 命令的解析是否可以脫離if-else
- 定義了一個handler 來處理命令
- 用hash表來保存命令和Handler之間的關係