框架加数据

  • 把数据的硬编码尽可能解成框架加数据的结构
  • 城堡游戏修改后的代码
    •   Room类
      1. package com.castle;
      2.  
      3. import java.util.HashMap;
      4.  
      5. public class Room {
      6. private String description;
      7. private HashMap<String, Room> exits=new HashMap<String, Room>();
      8.  
      9. public Room(String description)
      10. {
      11. this.description = description;
      12. }
      13.  
      14. public String getEixtDesc()
      15. {
      16. StringBuffer sb=new StringBuffer();
      17. for (String dir : exits.keySet())
      18. {
      19. sb.append(dir+" ");
      20. }
      21. return sb.toString();
      22. }
      23.  
      24. public void setExit(String dir,Room room)
      25. {
      26. exits.put(dir, room);
      27. }
      28.  
      29. public Room getExit(String direction)
      30. {
      31. return exits.get(direction);
      32. }
      33.  
      34. @Override
      35. public String toString()
      36. {
      37. return description;
      38. }
      39. }
    • Game类
      1. package com.castle;
      2.  
      3. import java.util.HashMap;
      4. import java.util.Scanner;
      5.  
      6. public class Game {
      7. private Room currentRoom;
      8.  
      9. private HashMap<String, Handler> handlers=new HashMap<String, Handler>();
      10. public Game()
      11. {
      12. handlers.put("go", new HandlerGo(this));
      13. handlers.put("Bye", new HandlerBye(this));
      14. handlers.put("Help", new HandlerHelp(this));
      15. createRooms();
      16. }
      17.  
      18. private void createRooms()
      19. {
      20. Room outside, lobby, pub, study, bedroom;
      21.  
      22. // 制造房间
      23. outside = new Room("城堡外");
      24. lobby = new Room("大堂");
      25. pub = new Room("小酒吧");
      26. study = new Room("书房");
      27. bedroom = new Room("卧室");
      28.  
      29. // 初始化房间的出口
      30. outside.setExit("east", lobby) ;
      31. outside.setExit("south", study) ;
      32. outside.setExit("west", pub) ;
      33.  
      34. lobby.setExit("west", outside) ;
      35.  
      36. pub.setExit("east", outside) ;
      37.  
      38. study.setExit("north", outside) ;
      39. study.setExit("east", bedroom) ;
      40.  
      41. bedroom.setExit("west", study) ;
      42.  
      43. lobby.setExit("up", pub);
      44. pub.setExit("down", lobby);
      45.  
      46. currentRoom = outside; // 从城堡门外开始
      47. }
      48.  
      49. private void printWelcome() {
      50. System.out.println();
      51. System.out.println("欢迎来到城堡!");
      52. System.out.println("这是一个超级无聊的游戏。");
      53. System.out.println("如果需要帮助,请输入 'help' 。");
      54. System.out.println();
      55. showPrompt();
      56.  
      57. }
      58.  
      59. // 以下为用户命令
      60.  
      61. public void showPrompt()
      62. {
      63. System.out.println("你在" + currentRoom);
      64. System.out.print("出口有: ");
      65. System.out.println(currentRoom.getEixtDesc());
      66. System.out.println();
      67. }
      68.  
      69. public void goRoom(String direction)
      70. {
      71. Room nextRoom = currentRoom.getExit(direction);
      72.  
      73. if (nextRoom == null) {
      74. System.out.println("那里没有门!");
      75. }
      76. else {
      77. currentRoom = nextRoom;
      78. showPrompt();
      79. }
      80. }
      81.  
      82. public void play()
      83. {
      84. Scanner in = new Scanner(System.in);
      85. while ( true ) {
      86. String line = in.nextLine();
      87. String[] words = line.split(" ");
      88. Handler handler=handlers.get(words[0]);
      89. String value="";
      90. if(words.length>1)
      91. value=words[1];
      92. if(handler !=null)
      93. {
      94. handler.doCmd(value);
      95. if(handler.isBye())
      96. break;
      97. }
      98. // if ( words[0].equals("help") ) {
      99. // printHelp();
      100. // } else if (words[0].equals("go") ) {
      101. // goRoom(words[1]);
      102. // } else if ( words[0].equals("bye") ) {
      103. // break;
      104. // }
      105. }
      106. in.close();
      107. }
      108.  
      109. public static void main(String[] args) {
      110. Game game = new Game();
      111. game.printWelcome();
      112. game.play();
      113. System.out.println("感谢您的光临。再见!");
      114. }
      115.  
      116. }
    • Handler类及其子类
      1. package com.castle;
      2.  
      3. public class Handler
      4. {
      5.  
      6. protected Game game;
      7.  
      8. public Handler(Game game)
      9. {
      10.  
      11. this.game = game;
      12. }
      13. public void doCmd(String word) {}
      14. public boolean isBye() {return false;}
      15. public static void main(String[] args)
      16. {
      17. // TODO Auto-generated method stub
      18.  
      19. }
      20.  
      21. }
      22.  
      23. package com.castle;
      24.  
      25. public class HandlerBye extends Handler
      26. {
      27.  
      28. public HandlerBye(Game game)
      29. {
      30. super(game);
      31. // TODO Auto-generated constructor stub
      32. }
      33.  
      34. @Override
      35. public boolean isBye()
      36. {
      37. // TODO Auto-generated method stub
      38. return true;
      39. }
      40.  
      41. }
      42.  
      43. package com.castle;
      44.  
      45. public class HandlerHelp extends Handler
      46. {
      47.  
      48. public HandlerHelp(Game game)
      49. {
      50. super(game);
      51. // TODO Auto-generated constructor stub
      52. }
      53.  
      54. @Override
      55. public void doCmd(String word)
      56. {
      57. System.out.print("迷路了吗?你可以做的命令有:go bye help");
      58. System.out.println("如:\tgo east");
      59. }
      60.  
      61. }
      62.  
      63. package com.castle;
      64.  
      65. public class HandlerGo extends Handler
      66. {
      67.  
      68. public HandlerGo(Game game)
      69. {
      70. super(game);
      71. // TODO Auto-generated constructor stub
      72. }
      73.  
      74. @Override
      75. public void doCmd(String word)
      76. {
      77. // TODO Auto-generated method stub
      78. game.goRoom(word);
      79. }
      80.  
      81. }

Java进阶学习(5)之设计原则(下)的更多相关文章

  1. 大型Java进阶专题(三) 软件架构设计原则(下)

    前言 ​ 今天开始我们专题的第二课了,本章节继续分享软件架构设计原则的下篇,将介绍:接口隔离原则.迪米特原则.里氏替换原则和合成复用原则.本章节参考资料书籍<Spring 5核心原理>中的 ...

  2. 大型Java进阶专题(二) 软件架构设计原则(上)

    前言 ​ 今天开始我们专题的第一课了,也是我开始进阶学习的第一天,我们先从经典设计思想开始,看看大牛市如何写代码的,提升技术审美.提高核心竞争力.本章节参考资料书籍<Spring 5核心原理&g ...

  3. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  4. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  5. Java进阶学习:将文件上传到七牛云中

    Java进阶学习:将文件上传到七牛云中 通过本文,我们将讲述如何利用七牛云官方SDK,将我们的本地文件传输到其存储空间中去. JavaSDK:https://developer.qiniu.com/k ...

  6. Java进阶学习:log4j的学习和使用

    Java进阶学习——log4j的学习和使用 简介Loj4j Log4j的组成 Log4j主要由三大组组件构成: Logger: 负责生成日志,并能够对日志信息进行分类筛选,通俗的讲就是决定什么日志信息 ...

  7. 适用于Java开发人员的SOLID设计原则简介

    看看这篇针对Java开发人员的SOLID设计原则简介.抽丝剥茧,细说架构那些事——[优锐课] 当你刚接触软件工程时,这些原理和设计模式不容易理解或习惯.我们都遇到了问题,很难理解SOLID + DP的 ...

  8. Java进阶学习(5)之设计原则(上)

    设计原则 城堡游戏 扩展 字符串被分割 String line = in.nextLine(); String[] words = line.split(" "); 消除代码复制 ...

  9. 十年阿里java架构师的六大设计原则和项目经验

      先看一幅图吧: 这幅图清晰地表达了六大设计原则,但仅限于它们叫什么名字而已,它们具体是什么意思呢?下面我将从原文.译文.理解.应用,这四个方面分别进行阐述. 1.单一职责原则(Single Res ...

  10. JAVA设计模式总结之六大设计原则

    从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...

随机推荐

  1. Web Workers - (Worker(专有) and SharedWorker(共享))

    Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法 线程可以执行任务而不干扰用户界面 可以使用XMLHttpRequest执行 I/O (尽管responseXML和channe ...

  2. SQLserver 数据类型转换

    1:CAST  方法 CAST(任何有效的表达试  AS 要转换的数据类型 [数据类型的长度,可选]) 例:SELECT  CAST(10000 as varchar(10)) SELECT  CAS ...

  3. phpstorm格式化数组

    如果我们想要的这样的数组格式的话,可以设置 <?php $arr = array["a" => 0, "b" => 1, "c&qu ...

  4. 2020牛客寒假算法基础集训营5 B.牛牛战队的比赛地 (二分/三分)

    https://ac.nowcoder.com/acm/contest/3006/B 三分做法 #include<bits/stdc++.h> #define inf 0x3f3f3f3f ...

  5. Java生鲜电商平台-生鲜电商订单结算系统的深入解析与反思总结

    Java生鲜电商平台-生鲜电商订单结算系统的深入解析与反思总结 说明:最近疫情影响,生鲜电商这个行业被彻底的激活了,全中国人民都知道用小程序或者APP可以进行买菜了,但是可惜的是,我的生鲜电商在去年经 ...

  6. python中可变类型和不可变类型数据的复制

    常见的复制方式有以下5种第1种:通过等号[=]复制 - 不论可变还是不可变数据类型,通过[=]复制后都指向同一个内存地址: - 改变复制后的数据(例子中的anotherStr,anotherList) ...

  7. console.log对象全部展开

    挖掘Chrome Console的小秘密 SP_lyu关注 2018.09.15 18:25:32字数 1,697阅读 917 控制台应该是大多数前端开发人员日常开发调试离不开的神器.然而控制台仍有很 ...

  8. Django_RESTful API

    https://q1mi.github.io/Django-REST-framework-documentation/ 1. DRF(Django REST framework) 序列化的类 2. 解 ...

  9. Java基础之使用Scanner类获取用户输入

    创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); Scanner 类的 next() 方法 import java.util.Scanne ...

  10. python setup.py 安装和卸载 的正确姿势

    1.install python setup.py install --record files.txt 2. uninstall 删除这些文件 cat files.txt | xargs rm -r ...