1700480953
34.1 搬移UNIX的命令
1700480954
1700480955
在操作系统的世界里,有两大阵营一直在PK着:*nix(包括UNIX和Linux)和Windows。从目前的统计数据来看,*nix在应用服务器领域占据相对优势,不过Windows也不甘示弱,国内某些小型银行已经在使用PC Server(安装Windows操作系统的服务器)集群来进行银行业务运算,而且稳定性、性能各方面的效果不错;而在个人桌面方面,Windows是占绝对优势的,大家应该基本上都在用这个操作系统,它的诸多优点这里就不多说了,我们今天就来解决一个习惯问题。如果你负责过UNIX系统维护,你自己的笔记本又是Windows操作系统的话,我想你肯定有这样的经验,如图34-1所示。
1700480956
1700480957
1700480958
1700480959
1700480960
图34-1 时常犯的错误
1700480961
1700480962
是不是经常把UNIX上的命令敲到Windows系统了?为了避免这种情况发生,可以把UNIX上的命令移植到Windows上,也就是Windows下的shell工具,有很多类似的工具,比如cygwin、GUN Bash等,这些都是非常完美的工具,我们今天的任务就是自己写一个这样的工具。怎么写呢?我们学了这么多的模式,当然要融会贯通了,可以使用命令模式、责任链模式、模板方法模式设计一个方便扩展、稳定的工具。
1700480963
1700480964
我们先说说UNIX下的命令,一条命令分为命令名、选项和操作数,例如命令”ls-l/usr”,其中,ls是命令名,l是选项,/usr是操作数,后两项都是可选项,根据实际情况而定。UNIX命令一定遵守以下几个规则:
1700480965
1700480966
❑命令名为小写字母。
1700480967
1700480968
❑命令名、选项、操作数之间以空格分隔,空格数量不受限制。
1700480969
1700480970
❑选项之间可以组合使用,也可以单独拆分使用。
1700480971
1700480972
❑选项以-(横杠)开头。
1700480973
1700480974
在UNIX世界中,我们最常用的就是ls这个命令,它用于显示目录或文件信息,下面我们先来看看这个命令。常用的有以下几条组合命令:
1700480975
1700480976
❑ls:简单列出一个目录下的文件。
1700480977
1700480978
❑ls-l:详细列出目录下的文件。
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命令族等,它组装出一个处理一个命令族的责任链,并返回首节点供高层模块调用,这是非常典型的责任链模式。
[
上一页 ]
[ :1.700480952e+09 ]
[
下一页 ]