您的位置:首页 > 移动开发 > Android开发

设计模式---命令模式(理解)

2012-08-20 23:13 302 查看
---------------------- android培训java培训、期待与您交流! ----------------------

之前看了命令模式,但还是不能自如的运用,后来多练习了几次多线程,觉得可以用多线程的思想来理解命令模式:

考虑到这样一种场景:某个方法需要完成某一个行为,但是这个行为的具体实现无法确定,必须等到执行该方法时才可以确定。就好像Ruby语言那样,可以传入一个代码块作为参数,但是java 7中目前还不支持代码块作为参数,就是说我们必须把“处理行为”作为参数传入该方法,这个“处理行为”实际上就是一段代码,那么怎样把这段代码传入该方法呢?

例如:假设有个方法需要遍历某个数组的数组元素,但无法确定在遍历数组元素是如何处理这些元素,需要在调用该方法时指定具体的处理行为。

我们在学习多线程时,java是用Runnable接口中定义run方法来封装线程要运行的代码,我们也可以使用一个Command接口来定义一个方法,并用这个方法来封装处理行为。

例如:

public interface Command {
//接口里定义的process方法用于封装“处理行为”
void process(int[]  target);
}

/*
* 定义一个需要处理数组的类,这个类中包含了一个process方法,
* 但这个方法无法确定处理数组的处理行为。
*/
public class ProcessArray {
public void process(int[] target,Command cmd){
cmd.process(target);
}
}

/*
* 定义一个具备遍历数组行为的类
*/
public class PrintCommand implements Command{
public void process(int[] target){
for(int tmp : target){
System.out.println("目标数组中的元素:" + tmp);
}
}

}

/*
*定义一个具备给数组中元素求和的类
*/
public class AddCommand implements Command{
public void process(int[] target){
int sum = 0;
for(int tmp :target){
sum += tmp;
}
System.out.println("数组元素和sum=" +  sum);
}

}

public class CommandTest {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int[] arr = {3,-4,6,4};
pa.process(arr, new PrintCommand());
System.out.println("---------------");
pa.process(arr, new AddCommand());

}
}


对于PrintCommand 和 AddCommand两个实现类而言,实际有意义的部分就是Process(int[] target)方法,该方法的方法体就是传入ProcessArray类里的process方法的“处理行为”,通过这种方式可以实现process方法和“处理行为的分离”。
如果“处理行为”只运行一次,可以用内部类实现,如下:

public class CommandTest {
public static void main(String[] args) {
ProcessArray pa = new ProcessArray();
int[] arr = {3,-4,6,4};
//如果代码只执行一次,可以用内部类实现
pa.process(arr, new Command(){
public void process(int[] target){
for(int tmp : target){
System.out.println("目标数组中的元素:" + tmp);
}
}
});

System.out.println("---------------");
pa.process(arr, new Command(){
public void process(int[] target){
int sum = 0;
for(int tmp :target){
sum += tmp;
}
System.out.println("数组元素和sum=" +  sum);
}

});

}
}


如果我们忘记了命令模式也没关系,只要记住多线程Runnable接口中的run()方法是封装线程要运行的代码就行了,命令模式也是类似的,这样就简单了。

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息