Java Tip: 实现Command模式[4]

[入库:2005年8月19日] [更新:2007年3月25日]

本文简介:选择自 lostmouse 的 blog

         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类中提供新的命令处理方法的实现。仅此而已。

结论

本文关键:Command
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top