自己写框架
1.程序开始运行,第一次程序提示用户可以通过“help”命令获得帮助。 2.然后提示用户现在可用的数据库有哪几种类型。 3.然后用户选择数据库类型。 4.程序获得到用户的命令后,根据命令为CommandManager类的Executor属性创建具体执行者类的实例,如说是FileExecutor的实例。 5.然后再提示用户提供这些数据库的地址,用户名,密码等,如果是把txt文件当作数据库来使用,可以直接连接文件,文件的路径直接写在程序里面。 6.用户输入设置命令,程序获得设置命令,调用Executor属性的setDBConnection(String)方法,通过参数连接数据库。 7.程序再次提示用户,连接成功可以数据操作命令 8.用户输入select name=zhangsan 9.程序调用Executor属性的selectNextPage(String)方法查找到所有的记录,返回给用户 10. 程序再次等待用户的新的操作指令。 11. 直到用户输入exit,结束程序。
现在问题是怎么根据用户的选择数据库的命令为Executor创建正确的执行类的实例,怎么根据用户的指令找到正确的方法来调用。
上次说到了Executor接口和具体的实现类,然后又说到了Class类。 给CommandManager类一个Executor类型的属性,利用Class根据用户输入的命令动态的创建Executor类的具体实现对象,这样就可以做到动态的选择命令的执行者。 但是事情并没有结束,我们怎么知道用户的命令对应那一个具体的执行者类型呢? 假如我们有一个包有一个执行类net.handsome.action.FileExecutor。我们总不能让用户输入命令的时候输入“net.handsome.action.FileExecutor”这么长的一个东西吧。 但是,我们又不能把根据用户的输入在程序里面用Map或者Set对应到类名上面来,因为这样我们的命令就和具体的执行者还是写在了程序里面。 幸好有配置文件可以选择,我就用简单的一种配置文件properties文件。利用Properties类我们可以很轻松的读取键值对,在文件里面只需要把键值对用等号连接即可。于是我定义了这样一个文件executor.map。 ###### ##这里是配置命令到执行数据库的映射的配置文件,如果你不是程序员或者不精通正则表达式请不要随意更改,否则可能造成程序的异常。 ## ##格式为:<前置命令符>=<执行者对应的系统类型>,<选择该数据库后需要提示的信息,通常是指提示用户设置数据库连接,如果是空则标示直接由系统自动按默认值连接数据库。> ##### file=net.handsome.action.FileExecutor, mysql=net.handsome.action.MysqlExecutor,请输入连接mysql数据库的相关参数,格式:set db\={dbpath:port} table\={tablename} user\={username} pas\={password} ######## 在这里只有两个键值对,file和mysql。当用户键入file的时候,我们可以通过file对应到net.handsome.action.FileExecutor类 当用户输入mysql的时候,我当然就对应到了net.handsome.action.MysqlExecutor类, 然后利用字符串记录这个类型的名称,然后利用Class创建这个名称对应的类的实例,然后赋值个CommandManager的Executor类型的属性。 这样我们就选好了命令的执行者。
具体的代码如下:
package net.handsome.manager; import java.io.BufferedReader;…………………… public class CommandManager{ private Executor executor = null; // 记录当前使用的执行者对象 public static String dbstate = ""; // 记录当前执行的数据库的种类 private boolean isContinue = true; // 标示是否可以继续下一步的执行。 public CommandManager() { super(); }……………………Properties properties = loadPropertiesFile("configure/executor.map"); String classNameAndMesg = null; int indexDivid = 0; classNameAndMesg = properties.getProperty(commandString); try { indexDivid = classNameAndMesg.indexOf(","); } catch (NullPointerException e) { properties = loadPropertiesFile("configure/executor.map"); Enumeration names = properties.propertyNames(); System.out.print("您的输入有误! 目前支持的数据有:"); while (names.hasMoreElements()) { System.out.print(names.nextElement().toString() + " "); } this.isContinue = false; return ""; } String executorClassName = null; if (indexDivid == -1) { executorClassName = classNameAndMesg; } else { executorClassName = classNameAndMesg.substring(0, indexDivid); } Class executorClass = null; try { executorClass = Class.forName(executorClassName); } catch (ClassNotFoundException e) { System.out.print("找不到需要的类,出现程序异常,可能是配置文件出现错误!请重新安装程序!"); this.isContinue = false; return ""; } try { setExecutor((Executor) executorClass.newInstance()); } catch (InstantiationException e) { System.out.print("程序级异常,类型初始化异常!请重新安装程序!"); this.isContinue = false; return ""; } catch (IllegalAccessException e) { // TODO e.printStackTrace(); } catch (ClassCastException e) { System.out.print("类型转换出现异常,可能是配置文件出现错误!请重新安装程序!"); this.isContinue = false; return ""; } |
[NextPage] 可以看到配置文件的具体类型名之后还有一段话,那个是用户选择这个执行这之后需要展示个用户的提示,告诉用户设置这个数据库需要输入的设置命令的格式。通常包括密码,用户名,服务器地址等。但是,如果提示语句为空,不如想file,那就直接连接,具体的连接方式已经写在程序里面。因为如果是file我只允许操作我指定程序目录下的一个txt文件。
通过操作指令得到具体的执行发放也是一样的,我有一个method.map文件, 左面写着用户输入的指令必须匹配的正则表达式,等号右边写着方法的名称。 ##### ##这里是配置命令到方法映射的配置文件,如果你不是程序员或者不精通正则表达式请不要随意更改,否则可能造成程序的异常。 ##### ^insert\\s[0-9]{1,6}$ = randominsert ^insert\\sname\=\\S{1,20}$ = insert ^insert\\sid\=1?[0-9]{1,9}\\sname\=\\S{1,20}$ = insert ^select\\sname\=\\S{1,20}$ = selectByName ^select\\sid\=1?[0-9]{1,9}$ = selectById ^nextpage$ = selectByName ^set\\sdb\=\\S+\\stable\=\\S+\\suser\=\\S+\\spas\=\\S+$ = setDBConnection 当用户输入select name=zhangsan的时候,会匹配到第四条正则表达式,如是通过他得到对应的值是selectByName,然后通过Class动态的利用selectByName这个字符串知道Executor的selectByName(String)方法,得到他的Method对象,然后调用(Method.invoke)。
现在也就是说我们通过两个配置文件,把CommandManager到具体的Executor之间分离了,把CommandManager到命令之间分离了。如果我们要添加执行者,我们只需要实现Executor接口,就行了,然后再在配置文件中增加一个数据库到执行者的对应。如果我们要添加方法,只需要在接口中添加这个方法,然后在配置文件中增加这个调用这个方法的命令对应的正则表达式就可以了。
下面是我的程序的目录结构:
再来看看程序的UML模型把:
以上是 自己写框架 的全部内容, 来源链接: utcz.com/p/206063.html