打字猴:1.700480996e+09
1700480996
1700480997
1700480998
1700480999 图34-2 命令族的解析类图
1700481000
1700481001 类图还是比较清晰的,UNIX的命令有上百个,我们定义一个CommandName抽象类,所有的命令都继承于该类,它就是责任链模式的handler类,负责链表控制;每个命令族都有一个独立的抽象类,因为每个命令族都有其独特的个性,比如ls命令和df命令,其后可加的参数是不一样的,这就可以在抽象类AbstractLS中定义,而且它还有标示作用,标示其下的实现类都是实现ls命令的,只是命令的选项不同;Context负责建立一条命令的链表,比如ls命令族、df命令族等,它组装出一个处理一个命令族的责任链,并返回首节点供高层模块调用,这是非常典型的责任链模式。
1700481002
1700481003 分析完毕一个具体的命令族,已经确定可以采用责任链模式,我们继续往下分析。UNIX命令非常多,敲一个命令返回一个结果,每个具体的命令可以由相关的命令族(也就是责任链)来解析,但是如此多的命令还是需要有一个派发的角色,输入一个命令,不管后台谁来解析,返回一个结果就成,这就要用到命令模式。命令模式负责协调各个命令正确地传递到各个责任链的首节点,这就是它的任务,其类图如图34-3所示。
1700481004
1700481005
1700481006
1700481007
1700481008 图34-3 命令传递类图
1700481009
1700481010 是不是典型的命令模式类图?其中Chain是一个标示符,表示的就是我们上面分析的责任链,每一个具体的命令负责调用责任链的首节点,获得返回值,结束命令的执行。两个核心模块都分析完毕了,就可以把类图融合在一起,完整的类图如图34-4所示。
1700481011
1700481012
1700481013
1700481014
1700481015 图34-4 完整类图
1700481016
1700481017 这个类图还是比较简单的,我们来看一下各个类的职责。
1700481018
1700481019 ❑ClassUtils
1700481020
1700481021 ClassUtils是工具类,其主要职责是根据一个接口、父类查找到所有的子类。在不考虑效率的应用中,使用该类可以带来非常好的扩展性。
1700481022
1700481023 ❑CommandVO
1700481024
1700481025 CommandVO是命令的值对象,它把一个命令解析为命令名、选项、操作数,例如”ls-l/usr”命令分别解析为getCommandName、getParam、getData三个方法的返回值。
1700481026
1700481027 ❑CommandEnum
1700481028
1700481029 CommandEnum是枚举类型,是主要的命令配置文件。为什么需要枚举类型?这是JDK 1.5提供的一个非常好的功能,我们在程序中再讲解如何使用它。
1700481030
1700481031 所有的分析都已经完成了,我们来看看程序。程序不复杂,看看类图,应该先写命令的解释,这是项目的核心。我们先来看CommandName抽象类,如代码清单34-1所示。
1700481032
1700481033 代码清单34-1 抽象命令名类
1700481034
1700481035 public abstract class CommandName{
1700481036
1700481037 private CommandName nextOperator;
1700481038
1700481039 public final String handleMessage(CommandVO vo){
1700481040
1700481041 //处理结果
1700481042
1700481043 String result=””;
1700481044
1700481045 //判断是否是自己处理的参数
[ 上一页 ]  [ :1.700480996e+09 ]  [ 下一页 ]