设计模式:命令模式(Command Pattern)
问题
某个类中需要定义一个方法,该方法要实现的功能不确定的,需要等到程序执行该方法的时候才确定下来。
例如:定义一个计算数组的方法,可能需要遍历输出数组,也有可能是需要对数组中元素求和。
解决方案
按照面向对象程序设计的原则,如果在设计类的时候,成员方法在不同的类中具体实现也是不同的,这种变化的方法可以抽取出来,形成接口。接口可以作为具体业务类的成员变量或者方法参数进行使用。
在本例中,接口将作为业务处理类的方法参数,和待处理数据构成方法的参数列表。这种设计模式即为:命令模式(Command Pattern),即向一个方法传入行为。
代码实现
1.把变化的行为定义为接口
/**把变化的行为定义为接口*/ public interface ICommand { /**处理数据的抽象方法*/ void process(int[] data); }
2.定义业务处理类
/**数据处理业务类*/ public class DataProcess { public void service(int[] data,ICommand command){ command.process(data); } }
业务处理类中,service方法用于处理数组的计算,计算方法依赖于ICommand接口的实现。程序运行的时候,根据传入ICommand接口不同的实现类,实现对数组data的不同计算方式。
3.定义不同的计算数组方法的实现类
定义第一种计算方法:
/**遍历输出数组元素*/ public class PrintCommand implements ICommand { @Override public void process(int[] data) { System.out.print("数组data中的元素有:"); for(int item:data){ System.out.print(item+" "); } } }
定义第二种计算方法:
/** 数组进行累加计算 */ public class AddCommand implements ICommand { @Override public void process(int[] data) { int sum=0; for(int i=0;i<data.length;i++){ sum+=data[i]; } System.out.println("数组所有元素之和为:"+sum); } }
4.测试实现
public static void main(String[] args) { DataProcess dp = new DataProcess(); int[] data = { 1, 2, -10, 9, 18 }; ICommand ic = new AddCommand(); dp.service(data, ic);// 数组累加 ic = new PrintCommand(); dp.service(data, ic);// 数组遍历输出 }
5.输出效果
总结
在本例中ICommad接口也称为“命令”,实际程序运行中,客户端调用传入的命令可能不同,因此需要把该命令抽象成接口,并作为业务类方法的参数进行使用,程序运行时可以传入不同的接口实现类,完成命令的具体实现。该设计模式就称为命令模式。
本博客文章未经许可,禁止转载和商业用途!
如有疑问,请联系: 2083967667@qq.com