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
//判断是否是自己处理的参数
1700481046
1700481047
if(vo.getParam().size()==0||vo.getParam().contains(this.getOperateParam())){
1700481048
1700481049
result=this.echo(vo);
1700481050
1700481051
}else{
[
上一页 ]
[ :1.700481002e+09 ]
[
下一页 ]