N长时间没来这了,没想到连后台界面都换了。。。
废话不说,进入正题!
系统框架:一棵"命令"树,一棵"数据"树,命令树的根 ,即顶端元素是一个抽象类或接口,对外提供一个 execute 方法,但是这个方法的返回类型会因为命令的不同而不同
,在这里举两个个实例,以学生选课来说。
命令一、学生选的课的列表 GetMyCourseCommand 命令的 execute() 方法应返回一个 List。
命令二、是不是选了某一个课程 CourseIsSelectedCommand 命令的 execute() 方法返回一个 Boolean。
这样的话,我的接口会定义成:
由于我不想让客户端知道自己到底调用了哪一个命令,于是写一个工厂来生产 Command,由于是工厂,所以 getCommand() 方法将被设置成 static 的,很简单,我犯不着每次想得到一个 Command 都创建一个 Factory 对象。
这样,客户端要做的,就是根据需求创建不同的 Data 对象,并将 data 对象传入工厂方法,刚才提及的 getCommand() 的完整定义是
至此,客户端在处理上述例子时对应应该做的就是:
例子一、
例子二、
客户端好像挺清晰的,但是 Java 的泛型却提示了警告,在中间那行生产Command对象的代码那。
试过N多方法,除了 new 一个工厂对象出来,并将 getCommand 改为成员方法外,都无法消除这个警告。当然,我也不确定这个做法是不是有点设计过度 :-(
废话不说,进入正题!
系统框架:一棵"命令"树,一棵"数据"树,命令树的根
命令一、学生选的课的列表 GetMyCourseCommand 命令的 execute() 方法应返回一个 List。
命令二、是不是选了某一个课程 CourseIsSelectedCommand 命令的 execute() 方法返回一个 Boolean。
这样的话,我的接口会定义成:
public
interface
Comamnd
<
T
>
{
public T execute();
}
public T execute();
}
由于我不想让客户端知道自己到底调用了哪一个命令,于是写一个工厂来生产 Command,由于是工厂,所以 getCommand() 方法将被设置成 static 的,很简单,我犯不着每次想得到一个 Command 都创建一个 Factory 对象。
这样,客户端要做的,就是根据需求创建不同的 Data 对象,并将 data 对象传入工厂方法,刚才提及的 getCommand() 的完整定义是
public
static
Command getCommand(Data d);
至此,客户端在处理上述例子时对应应该做的就是:
例子一、
Data d
=
new
GetMyCourseData(params...);
Command < List > cmd = CommandFactory.getCommand(d);
List < Course > list = cmd.execute();
Command < List > cmd = CommandFactory.getCommand(d);
List < Course > list = cmd.execute();
例子二、
Data d
=
new
CourseIsSelectedData(params...);
Command < Boolean > cmd = CommandFactory.getCommand(d);
boolean isSelected = cmd.execute();
Command < Boolean > cmd = CommandFactory.getCommand(d);
boolean isSelected = cmd.execute();
客户端好像挺清晰的,但是 Java 的泛型却提示了警告,在中间那行生产Command对象的代码那。
试过N多方法,除了 new 一个工厂对象出来,并将 getCommand 改为成员方法外,都无法消除这个警告。当然,我也不确定这个做法是不是有点设计过度 :-(