框架加数据

  • 把数据的硬编码尽可能解成框架加数据的结构
  • 城堡游戏修改后的代码
    •   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)之设计原则(下)的更多相关文章

  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. ubuntu set up 4 - 设置和软件

    1. Top Bar显示日期 https://askubuntu.com/questions/966576/customizing-tray-taskbar-date-display-in-ubunt ...

  2. [USACO10MAR] 伟大的奶牛聚集 - 树形dp

    每个点有重数,求到所有点距离最小的点 就是魔改的重心了 #include <bits/stdc++.h> using namespace std; #define int long lon ...

  3. Python标准库之时间模块time与datatime模块详解

    时间模块time与datatime 时间表示方式: 时间戳 格式化时间字符串 元组 时间戳格式: time.time()#输出1581664531.749063 元组格式: time.localtim ...

  4. bat文件一键运行python自动化脚本

    目标:建立一个双击即可运行自动化脚本的机制,而不用每次运行编译器,方便测试人员用户体验. 方法: 1. 将所有代码打包成exe文件,但一旦修改,又要重新打包. 2. 将运行代码写成bat文件,双击即执 ...

  5. jenkins pipline 如何禁止任务并行

    背景: 我测试的一个项目CI包括好几个步骤,但是有的步骤是不能并行的,否则会互相影响 处理过程: [方案一]:不推荐此方案 在每个步骤里面的shell脚本中加进程判断 示例:比如本任务有4个步骤,第2 ...

  6. JUC-分支合并框架

    一.原理 Fork:把一个复杂任务进行分拆,大事化小 Join:把分拆任务的结果进行合并 ForkJoinPool 分支合并池    类比=>   线程池 ForkJoinTask ForkJo ...

  7. WPF 解决无边框产生的相关问题

    原文:WPF 解决无边框产生的相关问题 最大化: 在设置WindowStyle="None" AllowsTransparency="True"后,最大化会覆盖 ...

  8. 题解【洛谷P6029】[JSOI2010]旅行

    题面 简化版题意:给出 \(n\) 个点 \(m\) 条边的无向图,可以交换任意两条边的权值 \(k\) 次,求 \(1\) 结点到 \(n\) 结点的最短路. 考虑\(\text{DP}\). 把所 ...

  9. 实现ENSP模拟器与物理主机、虚拟机通信

    一.环境描述 我需要实现华为模拟器中的网络设备和物理主机.虚拟机通信.这篇文章中以ENSP中的路由器为例,实现它和物理主机.虚拟机的通信.  二.实现方法 在ENSP中借助Cloud来实现. 在Clo ...

  10. 比较一下数据结构的链表和linux i2c驱动难度比较