设计模式:命令模式(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


原文地址:https://www.cnblogs.com/rask/p/8309876.html