Java 设计原则

一、城堡

1、

定义 Room 类。

定义了房子是什么,四个方向上的房子是什么。

package castle;

public class Room {
    public String description;//描述位置
    public Room northExit;//为什么是Room类型
    public Room southExit;
    public Room eastExit;
    public Room westExit;

    public Room(String description) 
    {
        this.description = description;//房子是什么
    }

    public void setExits(Room north, Room east, Room south, Room west) //4个方向房子是什么。
    {
        if(north != null)
            northExit = north;
        if(east != null)
            eastExit = east;
        if(south != null)
            southExit = south;
        if(west != null)
            westExit = west;
    }

    @Override
    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("城堡外");//初始对象,给description赋值
        lobby = new Room("大堂");
        pub = new Room("小酒吧");
        study = new Room("书房");
        bedroom = new Room("卧室");
        
        //	初始化房间的出口
        outside.setExits(null, lobby, study, pub);//outside周围的四个房间
        lobby.setExits(null, null, null, outside);
        pub.setExits(null, outside, null, null);
        study.setExits(outside, bedroom, null, null);
        bedroom.setExits(null, null, null, study);

        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("出口有:");
        if(currentRoom.northExit != null)
            System.out.print("north ");
        if(currentRoom.eastExit != null)
            System.out.print("east ");
        if(currentRoom.southExit != null)
            System.out.print("south ");
        if(currentRoom.westExit != null)
            System.out.print("west ");
        System.out.println();
    }

    // 以下为用户命令
    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.northExit;
        }
        if(direction.equals("east")) {
            nextRoom = currentRoom.eastExit;
        }
        if(direction.equals("south")) {
            nextRoom = currentRoom.southExit;
        }
        if(direction.equals("west")) {
            nextRoom = currentRoom.westExit;
        }

        if (nextRoom == null) {
            System.out.println("那里没有门!");
        }
        else {
            currentRoom = nextRoom;//更新所在房间
            System.out.println("你在" + currentRoom);
            System.out.print("出口有: ");
            if(currentRoom.northExit != null)
                System.out.print("north ");
            if(currentRoom.eastExit != null)
                System.out.print("east ");
            if(currentRoom.southExit != null)
                System.out.print("south ");
            if(currentRoom.westExit != null)
                System.out.print("west ");
            System.out.println();
        }
    }
	
	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();
	}

}

二、消除代码复制

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("城堡外");//初始对象,给description赋值
        lobby = new Room("大堂");
        pub = new Room("小酒吧");
        study = new Room("书房");
        bedroom = new Room("卧室");
        
        //	初始化房间的出口
        outside.setExits(null, lobby, study, pub);//outside连着三个房间
        lobby.setExits(null, null, null, outside);
        pub.setExits(null, outside, null, null);
        study.setExits(outside, bedroom, null, null);
        bedroom.setExits(null, null, null, study);

        currentRoom = outside;  //	从城堡门外开始
    }

    private void printWelcome() {//初始欢迎信息
        System.out.println();
        System.out.println("欢迎来到城堡!");
        System.out.println("这是一个超级无聊的游戏。");
        System.out.println("如果需要帮助,请输入 'help' 。");
        System.out.println();
        showPrompt();
    }

    // 以下为用户命令
    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.northExit;
        }
        if(direction.equals("east")) {
            nextRoom = currentRoom.eastExit;
        }
        if(direction.equals("south")) {
            nextRoom = currentRoom.southExit;
        }
        if(direction.equals("west")) {
            nextRoom = currentRoom.westExit;
        }

        if (nextRoom == null) {
            System.out.println("那里没有门!");
        }
        else {
            currentRoom = nextRoom;//更新所在房间
            showPrompt();
        }
    }
    public void showPrompt() //到达一个房间后的输出选择
    {
    	System.out.println("你在" + currentRoom);
        System.out.print("出口有: ");
        if(currentRoom.northExit != null)
            System.out.print("north ");
        if(currentRoom.eastExit != null)
            System.out.print("east ");
        if(currentRoom.southExit != null)
            System.out.print("south ");
        if(currentRoom.westExit != null)
            System.out.print("west ");
        System.out.println();
    }
	
	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();
	}

}

将公共的提取出来,定义新的构造函数。  

三、封装

Room类

package castle;

public class Room {
    private String description;//描述位置
    private Room northExit;//???为什么是Room类型
    private Room southExit;
    private Room eastExit;
    private Room westExit;

    public Room(String description) 
    {
        this.description = description;
    }

    public void setExits(Room north, Room east, Room south, Room west) //设置出口
    {
        if(north != null)
            northExit = north;
        if(east != null)
            eastExit = east;
        if(south != null)
            southExit = south;
        if(west != null)
            westExit = west;
    }

    @Override
    public String toString()
    {
        return description;
    }
    
    public String getExitDesc() // 得到出口  将Game中的输出移到Room
    {
//    	String ret="";  //这种方法开销大,每次都会产生一个新的String
//    	if(northExit!=null)
//    		ret+="north";
//    	if(eastExit!=null)
//    		ret+="east";
//    	if(westExit!=null)
//    		ret+="west";
//    	if(southExit!=null)
//    		ret+="south";
//    	return ret;
    	
    	StringBuffer sb=new StringBuffer();//这种方法开销小
    	if(northExit!=null)
    	    sb.append("north ");
		if(eastExit!=null)
			sb.append("east ");
		if(westExit!=null)
			sb.append("west ");
		if(southExit!=null)
			sb.append("south ");
		return sb.toString();
    }
    
    public Room selectNextRoom(String direction)//下一个房间
    {
    	Room nextRoom = null;
        if(direction.equals("north")) {
            nextRoom = this.northExit;
        }
        if(direction.equals("east")) {
            nextRoom = this.eastExit;
        }
        if(direction.equals("south")) {
            nextRoom = this.southExit;
        }
        if(direction.equals("west")) {
            nextRoom = this.westExit;
        }
        return nextRoom;
    }
    
}

黄的将出口信息返回,绿的将下一个房间的信息返回。蓝的给Room定义。

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("城堡外");//初始对象,给description赋值
        lobby = new Room("大堂");
        pub = new Room("小酒吧");
        study = new Room("书房");
        bedroom = new Room("卧室");
        
        //	初始化房间的出口
        outside.setExits(null, lobby, study, pub);//outside连着三个房间
        lobby.setExits(null, null, null, outside);
        pub.setExits(null, outside, null, null);
        study.setExits(outside, bedroom, null, null);
        bedroom.setExits(null, null, null, study);

        currentRoom = outside;  //	从城堡门外开始
    }

    private void printWelcome() {//初始欢迎信息
        System.out.println();
        System.out.println("欢迎来到城堡!");
        System.out.println("这是一个超级无聊的游戏。");
        System.out.println("如果需要帮助,请输入 'help' 。");
        System.out.println();
        showPrompt();
    }

    // 以下为用户命令
    private void printHelp() 
    {
        System.out.print("迷路了吗?你可以做的命令有:go bye help");
        System.out.println("如:\tgo east");
    }

    private void goRoom(String direction) 
    {
        Room nextRoom;
        nextRoom=currentRoom.selectNextRoom(direction);
        if (nextRoom == null) {
            System.out.println("那里没有门!");
        }
        else {
            currentRoom = nextRoom;//更新所在房间
            showPrompt();
        }
    }
    public void showPrompt() //到达一个房间后的输出选择
    {
    	System.out.println("你在" + currentRoom);
        System.out.print("出口有: ");
        System.out.print(currentRoom.getExitDesc());//调用Room类
        System.out.println();
    }
	
	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();
	}

}

四、可扩展性

1、

Room类

package castle;

import java.util.HashMap;

public class Room {
    private String description;//描述位置
    private HashMap<String,Room> exist=new HashMap<String ,Room>();//HashMap 的键值对来存放,一间屋子里n个方向上的地方
    
    public Room(String description) 
    {
        this.description = description;
    }

    public void setExit(String dir,Room room)//往容器存放内容
    {
    	exist.put(dir,room);
    }

    @Override
    public String toString()
    {
        return description;
    }
    
    public String getExitDesc() // 得到容器中的出口(键)
    {
    	StringBuffer sb=new StringBuffer();//这种方法开销小
    	for(String dir:exist.keySet())//遍历键
    	{
    		sb.append(dir);
    		sb.append(" ");
    	}
		return sb.toString();
    }

    public Room selectNextRoom(String direction)//下一个房间
    {
        return exist.get(direction);//得到键对应的值
    }
    
}

2、Game类

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("城堡外");//初始对象,给description赋值
        lobby = new Room("大堂");
        pub = new Room("小酒吧");
        study = new Room("书房");
        bedroom = new Room("卧室");
        
        //	初始化房间的出口
        outside.setExit("east", lobby);//outside连着三个房间
        outside.setExit("south", study);
        outside.setExit("west",pub);
        lobby.setExit("west", outside);
        lobby.setExit("up", bedroom);//自由增加房间各个出口
        pub.setExit("west",outside);
        study.setExit("north",outside);
        study.setExit("east",bedroom);
        bedroom.setExit("west", study);
        bedroom.setExit("down", lobby);
        

        currentRoom = outside;  //	从城堡门外开始
    }

    private void printWelcome() {//初始欢迎信息
        System.out.println();
        System.out.println("欢迎来到城堡!");
        System.out.println("这是一个超级无聊的游戏。");
        System.out.println("如果需要帮助,请输入 'help' 。");
        System.out.println();
        showPrompt();
    }

    // 以下为用户命令
    private void printHelp() 
    {
        System.out.print("迷路了吗?你可以做的命令有:go bye help");
        System.out.println("如:\tgo east");
    }

    private void goRoom(String direction) 
    {
        Room nextRoom;
        nextRoom=currentRoom.selectNextRoom(direction);
        if (nextRoom == null) {
            System.out.println("那里没有门!");
        }
        else {
            currentRoom = nextRoom;//更新所在房间
            showPrompt();
        }
    }
    public void showPrompt() //到达一个房间后的输出选择
    {
    	System.out.println("你在" + currentRoom);
        System.out.print("出口有: ");
        System.out.print(currentRoom.getExitDesc());//调用Room类
        System.out.println();
    }
	
	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();
	}

}

本质上,是容器一一对应的关系。一个方向,定了一个房间。用容器来存放方向和房间。

五、框架+数据提高可扩展性

  

  

  

  

  

  

猜你喜欢

转载自www.cnblogs.com/ruo-li-suo-yi/p/9180206.html