1700463160
在原有的类图上增加了一个Invoker类,其作用是根据客户的命令安排不同的组员进行工作,例如客户说“界面上删除一条记录”,Invoker类接收到该String类型命令后,通知美工组PageGroup开始delete,然后再找到代码组CodeGroup后台不要存到数据库中,最后反馈给客户一个执行计划。这是一个挺好的方案,但是客户的命令是一个String类型的,这有非常多的变化,仅仅通过一个字符串来传递命令并不是一个非常好的方案,因为在系统设计中,字符串没有约束力,根据字符串判断相关的业务逻辑不是一个优秀的解决方案。那怎么才是一个优秀的方案呢?解决方案是:对客户发出的命令进行封装,每个命令是一个对象,避免客户、负责人、组员之间的交流误差,封装后的结果就是客户只要说一个命令,我的项目组就立刻开始启动,不用思考、解析命令字符串,如图15-3所示。
1700463161
1700463162
1700463163
1700463164
1700463165
图15-3 完美的类图
1700463166
1700463167
Command抽象类只有一个方法execute,其作用就是执行命令,子类非常坚决地实现该命令,与军队中类似,上级军官给士兵发布命令:爬上这个旗杆!然后士兵回答:Yes,Sir!完美的项目也与此类似,客户发送一个删除页面的命令,接头负责人Invoker接收到命令后,立刻执行DeletePageCommand的execute方法。对类图中增加的几个类说明如下:
1700463168
1700463169
Command抽象类:客户发给我们的命令,定义三个工作组的成员变量,供子类使用;定义一个抽象方法execute,由子类来实现。
1700463170
1700463171
Invoker实现类:项目接头负责人,setComand接收客户发给我们的命令,action方法是执行客户的命令(方法名写成是action,与command的execute区分开,避免混淆)。
1700463172
1700463173
其中,Command抽象类是整个扩展的核心,其源代码如代码清单15-7所示。
1700463174
1700463175
代码清单15-7 抽象命令类
1700463176
1700463177
public abstract class Command{
1700463178
1700463179
//把三个组都定义好,子类可以直接使用
1700463180
1700463181
protected RequirementGroup rg=new RequirementGroup();//需求组
1700463182
1700463183
protected PageGroup pg=new PageGroup();//美工组
1700463184
1700463185
protected CodeGroup cg=new CodeGroup();//代码组
1700463186
1700463187
//只有一个方法,你要我做什么事情
1700463188
1700463189
public abstract void execute();
1700463190
1700463191
}
1700463192
1700463193
抽象类很简单,具体的实现类只要实现execute方法就可以了。在一个项目中,需求增加是很常见的,那就把“增加需求”定义为一个命令AddRequirementCommand类,如代码清单15-8所示。
1700463194
1700463195
代码清单15-8 增加需求的命令
1700463196
1700463197
public class AddRequirementCommand extends Command{
1700463198
1700463199
//执行增加一项需求的命令
1700463200
1700463201
public void execute(){
1700463202
1700463203
//找到需求组
1700463204
1700463205
super.rg.find();
1700463206
1700463207
//增加一份需求
1700463208
1700463209
super.rg.add();
[
上一页 ]
[ :1.70046316e+09 ]
[
下一页 ]