1700480979
1700480980
❑ls-a:列出目录下包含的隐藏文件,主要是.(点号)开头的文件。
1700480981
1700480982
❑ls-s:列出文件的大小。
1700480983
1700480984
除此之外,还有一些非常常用的组合命令,如”ls-la”、“ls-ls”等。ls命令名确定了,但是其后连接的选项和操作数是不确定的。操作数我们不用关心它,每个命令必然有一个操作数,若没有则是当前的目录。问题的关键是选项,用哪个选项以及什么时候使用都是由用户决定的,也就是从设计上考虑。设计者需要完全解析所有的参数,需要很多个类来处理如此多的选项,客户输入一个参数,立刻返回一个结果。针对一个ls命令族,要求如下:
1700480985
1700480986
❑每一个ls命令都有操作数,默认操作数为当前目录。
1700480987
1700480988
❑选项不可重复,例如对于”ls-l-l-s”,解析出的选项应该只有两个:l选项和s选项。
1700480989
1700480990
❑每个选项返回不同的结果,也就是说每个选项应该由不同的业务逻辑来处理。
1700480991
1700480992
❑为提高扩展性,ls命令族内的运算应该是对外封闭的,减少外界访问ls命令族内部细节的可能性。
1700480993
1700480994
针对一个命令族的分析结果,我们可以使用什么模式?责任链模式!对,只要把一个参数传递到链首,就可以立刻获得一个结果,中间是如何传递的以及由哪个逻辑解析都不需要外界(高层)模块关心,该模块的类图如图34-2所示。
1700480995
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
[
上一页 ]
[ :1.700480979e+09 ]
[
下一页 ]