Java命令模式轻松理解


情景:某个方法需要实现一个行为,但是这个行为的具体实现却无法确定,必须等到执行这个方法的时候才能确定。

考虑:这个方法不仅需要普通数据可以变化,而且方法执行体也需要改变,将“处理行为”作为一个参数传入该方法不失为一种方法

结论:但是java目前的jdk1.6版本不想Ruby语言支持袁旭传入一个代码块作为参数

如何实现这种呢,假如一个方法需要遍历一组数组,但是无法确定在遍历的时候如何处理这些数据,需要在调用该方法时指定具体的做法:

interface:

  1. public interface Command {  
  2. //由于jdk1.6中不允许传入一个代码块作为参数,   
  3. //这里定义一个方法来封装 处理过程   
  4.     void process(int [] target);  
  5. }  
两个处理过程接口实现类:
  1. public class AddCommand implements Command {  
  2.   
  3.     @Override  
  4.     public void process(int[] target) {  
  5.     int sum=0;  
  6.     for(int k:target){  
  7.         sum+=k;  
  8.     }  
  9.     System.out.println("数组和是:"+sum);  
  10.   
  11.     }  
  12.   
  13. }  
 
  1. public class PrintCommand implements Command {  
  2.   
  3.   
  4.     @Override  
  5.     public void process(int[] target) {  
  6.         for(int k :target){  
  7.             System.out.println("依次输出数组元素:"+k);  
  8. }  
  9.   
  10. }  
  11.   
  12.   
  13. }  
ProcessArray(处理类):
  1. public class ProcessArray {  
  2. public void process(int [] target,Command cmd){  
  3.     cmd.process(target);  
  4. }  
  5. }  

TestCommand(测试类):

  1. public class TestCommand {  
  2. public static void main(String [] args){  
  3.     ProcessArray pra=new ProcessArray();  
  4.     int [] target={1,2,3,4,5};  
  5.     //处理行为依赖于PrintCommand   
  6.     pra.process(target, new PrintCommand());  
  7.     System.out.println("******");  
  8.     //处理行为依赖于AddCommand()   
  9.     pra.process(target, new AddCommand());  
  10. }  


对于上面两个Print和AddCommand实现类,就是为了实现方法process(int 【】 target),而该方法也就是处理类ArrayProcess里process方法的处理行为。

这样,就实现process方法和处理行为的分离。

相关内容