设计模式---命令模式(理解)
2012-08-20 23:13
302 查看
---------------------- android培训、java培训、期待与您交流! ----------------------
之前看了命令模式,但还是不能自如的运用,后来多练习了几次多线程,觉得可以用多线程的思想来理解命令模式:
考虑到这样一种场景:某个方法需要完成某一个行为,但是这个行为的具体实现无法确定,必须等到执行该方法时才可以确定。就好像Ruby语言那样,可以传入一个代码块作为参数,但是java 7中目前还不支持代码块作为参数,就是说我们必须把“处理行为”作为参数传入该方法,这个“处理行为”实际上就是一段代码,那么怎样把这段代码传入该方法呢?
例如:假设有个方法需要遍历某个数组的数组元素,但无法确定在遍历数组元素是如何处理这些元素,需要在调用该方法时指定具体的处理行为。
我们在学习多线程时,java是用Runnable接口中定义run方法来封装线程要运行的代码,我们也可以使用一个Command接口来定义一个方法,并用这个方法来封装处理行为。
例如:
对于PrintCommand 和 AddCommand两个实现类而言,实际有意义的部分就是Process(int[] target)方法,该方法的方法体就是传入ProcessArray类里的process方法的“处理行为”,通过这种方式可以实现process方法和“处理行为的分离”。
如果“处理行为”只运行一次,可以用内部类实现,如下:
如果我们忘记了命令模式也没关系,只要记住多线程Runnable接口中的run()方法是封装线程要运行的代码就行了,命令模式也是类似的,这样就简单了。
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima
之前看了命令模式,但还是不能自如的运用,后来多练习了几次多线程,觉得可以用多线程的思想来理解命令模式:
考虑到这样一种场景:某个方法需要完成某一个行为,但是这个行为的具体实现无法确定,必须等到执行该方法时才可以确定。就好像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
相关文章推荐
- 深入理解JavaScript系列(34):设计模式之命令模式
- 深入理解JavaScript系列(34):设计模式之命令模式
- 【软考复习】对设计模式之---命令模式的理解
- 极速理解设计模式系列:17.命令模式(Command Pattern)
- 极速理解设计模式系列:17.命令模式(Command Pattern)
- 我所理解的设计模式——对象行为之命令(Comand)模式
- 深入理解JavaScript系列(34):设计模式之命令模式
- 我所理解的设计模式(C++实现)——命令模式(Command Pattern)
- 深入理解JavaScript系列(34):设计模式之命令模式
- 我所理解的设计模式(C++实现)——命令模式(Command Pattern)
- 深入理解JavaScript系列(34):设计模式之命令模式详解
- GOF23设计模式之命令模式(Command)的理解与实现
- 深入理解JavaScript系列(34):设计模式之命令模式
- 设计模式之命令模式[自我理解]
- 我所理解的设计模式(C++实现)——命令模式(Command Pattern)
- 理解设计模式之----命令模式
- 深入理解JavaScript系列(34):设计模式之命令模式
- 深入理解JavaScript系列(34):设计模式之命令模式
- 深入理解JavaScript系列(34):设计模式之命令模式详解
- 深入理解JavaScript系列(34):设计模式之命令模式