try {
class cls = class.forname(classname);
command = (command) cls.newinstance();
}
catch (throwable e) {
system.err.println(e);
}
command.execute();
}
}
}
class addcommand extends transactioncommand {
private commandreceiver cr;
public addcommand () {
cr = commandreceiver.gethandle();
}
public void execute( ) {
cr.methadd();
}
}
class subtractcommand extends transactioncommand {
private commandreceiver cr;
public subtractcommand () {
cr = commandreceiver.gethandle();
}
public void execute( ) {
cr.methsubtract();
}
}
class commandargument {
private int[] args;
commandargument() {
args = new int[2];
}
public int[] getarguments() {
return args;
}
public void setargument(int i1, int i2) {
args[0] = i1; args[1] = i2;
}
}
public class testtransactioncommand {
private vector clist,alist;
public testtransactioncommand() {
clist = new vector();
alist = new vector();
}
public void clearbuffer(vector c, vector a) {
clist.removeall(c);
alist.removeall(a);
}
public vector getclist() {
return clist;
}
public vector getalist() {
return alist;
}
public static void main(string[] args) {
commandargument ca,ca2;
testtransactioncommand t = new testtransactioncommand();
ca = new commandargument();
ca.setargument(2,8);
vector myclist = t.getclist();
vector myalist = t.getalist();
myclist.addelement("add"); myalist.addelement(ca);
transactioncommand tc = new transactioncommand(myclist,myalist);
commandmanager cm = new commandmanager(tc);
cm.runcommands();
t.clearbuffer(myclist,myalist);
ca2 = new commandargument();
ca2.setargument(5,7);
myclist = t.getclist();
myalist = t.getalist();
myclist.addelement("subtract"); myalist.addelement(ca2);
myclist.addelement("add"); myalist.addelement(ca2);
transactioncommand tc2 = new transactioncommand(myclist,myalist);
commandmanager cm2 = new commandmanager(tc2);
cm2.runcommands();
}
}
命令及其参数保存在列表中,并被封装成通用transactioncommand对象。通用transactioncommand用commandmanager来注册。任何时候,命令可以在commandmanager类中通过调用runcommands()接口来执行。
客户代码不依赖于任何具体的transactioncommand子类,也就是说,我的设计是针对接口而不是实现。这带来了灵活性:要想增加一个新的命令,只需要定义一个新的transactioncommand子类,并在commandreceiver类中提供新的命令处理方法的实现。仅此而已。
结论