Java进阶学习(5)之设计原则(下)
框架加数据
- 把数据的硬编码尽可能解成框架加数据的结构
- 城堡游戏修改后的代码
- Room类
package com.castle; import java.util.HashMap; public class Room {
private String description;
private HashMap<String, Room> exits=new HashMap<String, Room>(); public Room(String description)
{
this.description = description;
} public String getEixtDesc()
{
StringBuffer sb=new StringBuffer();
for (String dir : exits.keySet())
{
sb.append(dir+" ");
}
return sb.toString();
} public void setExit(String dir,Room room)
{
exits.put(dir, room);
} public Room getExit(String direction)
{
return exits.get(direction);
} @Override
public String toString()
{
return description;
}
}- Game类
package com.castle; import java.util.HashMap;
import java.util.Scanner; public class Game {
private Room currentRoom; private HashMap<String, Handler> handlers=new HashMap<String, Handler>();
public Game()
{
handlers.put("go", new HandlerGo(this));
handlers.put("Bye", new HandlerBye(this));
handlers.put("Help", new HandlerHelp(this));
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("west", outside) ; pub.setExit("east", outside) ; study.setExit("north", outside) ;
study.setExit("east", bedroom) ; bedroom.setExit("west", study) ; lobby.setExit("up", pub);
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();
showPrompt(); } // 以下为用户命令 public void showPrompt()
{
System.out.println("你在" + currentRoom);
System.out.print("出口有: ");
System.out.println(currentRoom.getEixtDesc());
System.out.println();
} public void goRoom(String direction)
{
Room nextRoom = currentRoom.getExit(direction); if (nextRoom == null) {
System.out.println("那里没有门!");
}
else {
currentRoom = nextRoom;
showPrompt();
}
} public void play()
{
Scanner in = new Scanner(System.in);
while ( true ) {
String line = in.nextLine();
String[] words = line.split(" ");
Handler handler=handlers.get(words[0]);
String value="";
if(words.length>1)
value=words[1];
if(handler !=null)
{
handler.doCmd(value);
if(handler.isBye())
break;
}
// if ( words[0].equals("help") ) {
// printHelp();
// } else if (words[0].equals("go") ) {
// goRoom(words[1]);
// } else if ( words[0].equals("bye") ) {
// break;
// }
}
in.close();
} public static void main(String[] args) {
Game game = new Game();
game.printWelcome();
game.play();
System.out.println("感谢您的光临。再见!");
} }- Handler类及其子类
package com.castle; public class Handler
{ protected Game game; public Handler(Game game)
{ this.game = game;
}
public void doCmd(String word) {}
public boolean isBye() {return false;}
public static void main(String[] args)
{
// TODO Auto-generated method stub } } package com.castle; public class HandlerBye extends Handler
{ public HandlerBye(Game game)
{
super(game);
// TODO Auto-generated constructor stub
} @Override
public boolean isBye()
{
// TODO Auto-generated method stub
return true;
} } package com.castle; public class HandlerHelp extends Handler
{ public HandlerHelp(Game game)
{
super(game);
// TODO Auto-generated constructor stub
} @Override
public void doCmd(String word)
{
System.out.print("迷路了吗?你可以做的命令有:go bye help");
System.out.println("如:\tgo east");
} } package com.castle; public class HandlerGo extends Handler
{ public HandlerGo(Game game)
{
super(game);
// TODO Auto-generated constructor stub
} @Override
public void doCmd(String word)
{
// TODO Auto-generated method stub
game.goRoom(word);
} }
Java进阶学习(5)之设计原则(下)的更多相关文章
- 大型Java进阶专题(三) 软件架构设计原则(下)
前言 今天开始我们专题的第二课了,本章节继续分享软件架构设计原则的下篇,将介绍:接口隔离原则.迪米特原则.里氏替换原则和合成复用原则.本章节参考资料书籍<Spring 5核心原理>中的 ...
- 大型Java进阶专题(二) 软件架构设计原则(上)
前言 今天开始我们专题的第一课了,也是我开始进阶学习的第一天,我们先从经典设计思想开始,看看大牛市如何写代码的,提升技术审美.提高核心竞争力.本章节参考资料书籍<Spring 5核心原理&g ...
- java设计模式学习笔记--接口隔离原则
接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...
- java设计模式学习笔记--单一职责原则
单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...
- Java进阶学习:将文件上传到七牛云中
Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...
- Java进阶学习:log4j的学习和使用
Java进阶学习——log4j的学习和使用 简介Loj4j Log4j的组成 Log4j主要由三大组组件构成: Logger: 负责生成日志,并能够对日志信息进行分类筛选,通俗的讲就是决定什么日志信息 ...
- 适用于Java开发人员的SOLID设计原则简介
看看这篇针对Java开发人员的SOLID设计原则简介.抽丝剥茧,细说架构那些事——[优锐课] 当你刚接触软件工程时,这些原理和设计模式不容易理解或习惯.我们都遇到了问题,很难理解SOLID + DP的 ...
- Java进阶学习(5)之设计原则(上)
设计原则 城堡游戏 扩展 字符串被分割 String line = in.nextLine(); String[] words = line.split(" "); 消除代码复制 ...
- 十年阿里java架构师的六大设计原则和项目经验
先看一幅图吧: 这幅图清晰地表达了六大设计原则,但仅限于它们叫什么名字而已,它们具体是什么意思呢?下面我将从原文.译文.理解.应用,这四个方面分别进行阐述. 1.单一职责原则(Single Res ...
- JAVA设计模式总结之六大设计原则
从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...
随机推荐
- 如何将.sql文件导入到mysql的数据库中
首先通过cmd的net start mysql57 启动mysql的服务器 然后,输入命令:mysql -h 127.0.0.1 -u root -p来启动mysql服务 最后 上图画红圈的部分是.s ...
- MyEclipse启动Tomcat报错:Could not find the main class: org.apache.catalina.startup
问题描述 Could not find the main class:org.apache.catalina.startup.Bootstrap. Program will exit 问题原因 主要原 ...
- day06_类与对象、封装、构造方法
02_面向对象与常用类 01_面向对象思想的概述 面向过程:当需要实现一个功能的时候,每个具体的步骤都需要亲力亲为,详细处理每一个细节. 面向对象:当需要实现一个功能的时候,不关心具体步骤,而是找一个 ...
- MAC MAMP集成环境安装 PHP 扩展
MAC MAMP集成环境安装 PHP扩展 开发环境中,对于需要维护很多 WEB 站点,以及可能会使用到很多不同的 PHP 版本,集成环境比较好用,在MAC 上 MAMP 集成环境是比较好用的,但是在安 ...
- 还不错的Table样式和form表单样式
作为一个后台开发人员而言,拥有一套属于自己的前台样式是比较重要的,这里分享一下自己感觉还不错的样式,以后遇到好的,还会陆续添加 上图: 带鼠标滑动效果的table样式看起来比较清爽 样式 <he ...
- Qt VS Tools插件官方下载及安装
下载 官方下载地址:https://download.qt.io/development_releases/vsaddin/(国外网站直接打开超级慢) 找到对应的VS版本下载 安装 下载完成后安装,打 ...
- asp.net mvc获取http body中的json
今天遇到一个对方直接post 一共json对象字符串过来的场景.按照以前的旧方案方法可以直接在request.inputstream里面读取,然后反序列化即可.(当然估计ASP.NET MVC应该有更 ...
- QQ第三方登录(一)
要实现QQ第三方登陆 这就需要QQ方面的支持. 首先 我们需要在QQ开发者网站上注册,https://connect.qq.com/index.html 登陆之后点击应用管理,正常情况下我们是未提交 ...
- 巨杉Tech | SequoiaDB虚机镜像正式上线
数据库云化架构需求 随着云架构的发展和流行,在业务和应用进行“云化”的过程中,云数据库因为在整体架构中的重要地位,在云化改造中的重要性不言而喻.云数据库需要满足这些技术要求,除了在功能上的具体提升,在 ...
- 洛谷P1071 潜伏者
https://www.luogu.org/problem/P1071 #include<bits/stdc++.h> using namespace std; map<char,c ...