Java进阶学习(5)之设计原则(下)

框架加数据

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

原文地址:https://www.cnblogs.com/quxiangjia/p/12274381.html

时间: 2024-08-10 16:10:26

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

Java进阶学习(2)——log4j的学习和使用

Java进阶学习(2)--log4j的学习和使用 简介Loj4j Log4j的组成 Log4j主要由三大组组件构成: Logger: 负责生成日志,并能够对日志信息进行分类筛选,通俗的讲就是决定什么日志信息应该被输出,什么日志信息应该被忽略. Appender: 定义了日志信息输出的目的地,指定日志信息应该被输出到什么地方,这些地方可以是控制台.文件或网络设备等. Layout: 指定日志信息的输出格式. 说明: 一个Logger可以有多个Appender,这意味着日志信息可以被输出到多个设备上

java进阶学习计划

断断续续使用java也已经有两年了,算是最熟悉的开发工具了.但写的代码都是以项目为导向,追求work around,还需要打好基础才能长远发展. 大致的进阶学习计划, 阶段1:深究java语法,阅读常用库的jdk源码,了解jvm机制; 阶段2:阅读基于java的开源框架源码,各种framework,container. 希望可以坚持下来,经常更新技术博客. java进阶学习计划

Java:进阶学习(1)——网络编程

Java:进阶学习(1)--网络编程 基础 Socket与ServerSocket Socket又称"套接字",网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket方法 getInetAddress();    远程服务端的IP地址 getPort();    远程服务端的端口 getLocalAddress()    本地客户端的IP地址 getLocalPort()    本地客户端的端口 getInputStream();   

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

看看这篇针对Java开发人员的SOLID设计原则简介.抽丝剥茧,细说架构那些事——[优锐课] 当你刚接触软件工程时,这些原理和设计模式不容易理解或习惯.我们都遇到了问题,很难理解SOLID + DP的思想,甚至很难正确实施它们.确实,“为什么要SOLID?”的整个概念,以及如何实施设计模式,这需要时间和大量实践. 我可以说实话,关于SOLID设计模式以及TDD等其他领域,从本质上讲,它们很难教.很难以正确的方式将所有这些知识和信息传授给年轻人. 让SOLID 变得容易 在本文中,我将以尽可能简单

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

先看一幅图吧: 这幅图清晰地表达了六大设计原则,但仅限于它们叫什么名字而已,它们具体是什么意思呢?下面我将从原文.译文.理解.应用,这四个方面分别进行阐述. 1.单一职责原则(Single Responsibility Principle - SRP) 原文:There should never be more than one reason for a class to change. 译文:永远不应该有多于一个原因来改变某个类. 理解:对于一个类而言,应该仅有一个引起它变化的原因.说白了就是

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

从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇看完,脑子里面已经能够对绝大多数的设计模式能够说出其核心思想且可以画出类图也知道应用场景,算是一个进步,但可能还不能够特别熟练的使用,可能需要多多巩固和强化使用才能够完全理解设计模式的精髓所在.学习期间收获还是不少的: 1.从只听过设计模式到学习了所有的设计模式,并写了不少设计模式的博客,在公司期间

【我的《冒号课堂》学习笔记】设计原则(2)依赖原则

依赖原则 间接原则有一个直接的推论,就是依赖反转原则(Dependency Inversion Principle),简称DIP.依赖反转原则就是高层模块不应依赖低层模块,它们都应依赖抽象:抽象不应依赖细节,细节应依赖抽象. 1)DIP的产生背景 从代码实现的角度来看,高层模块依赖低层模块是很正常的.而且高层模块与低层模块之间往往是决策(policy)与机制(mechanism)之间的关系,高层决策以低层机制为基础,逻辑上似乎也很合理.然而从软件设计上的角度看,这种依赖性却是非常不合理的.依赖通

设计模式学习笔记之设计原则

利用继承来提供对象的行为,会导致: 1.代码在多个子类中重复                            2.很难知道所有鸭子的全部行为 3.运行时的行为不易改变                            4.改变会牵一发而动全身,造成其他鸭子不想要的改变   设计原则 1 :找出应用之中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起. 注释:把会变化的部分取出并“封装”起来,以便以后可以轻易的改动或者扩充此部分,好让其他部分不受影响.代码变化引起的不

Java设计模式的7种设计原则还有很多人不知道

前言 其实没有设计模式我们也能完成开发工作.但是为什么需要设计模式呢?让你看起来很牛,没错这个算一个.让你的代码层次感分明,可读性强而且容易维护.让你像我一样有更多的摸鱼划水时间. 可能有人说我一个类或者方法就干完的东西,你搞了七八个.当然使用设计模式也是要斟酌的.一些简单稳定的业务也不推荐使用设计模式.设计模式多用于复杂多变的业务或者要求适配性.扩展性更强的场景中.不要为了设计模式而设计模式. 接下来我们结合实际开探讨一下设计模式的一些原则. 1.开闭原则 public class Selle