Java学习笔记(疯狂Java讲义第三版)——命令模式

命令模式:
假设,定义一个类,该类的功能可以实现对数组的遍历。数组的遍历指的就是访问数组中的每一个成员,并且该成员进行相应的处理。例如,将数组中的每一个元素加上一定的数值。或者输出打印每一个数组。

现在定义一个处理数组类,该类的功能是可以打印输出int类型数组的内容
class ProcessArray
{

public void process(int[] target){//定义一个可以遍历打印数组内容的功能
	for (int temp : target){
		System.out.println(temp);
	}
}

}
我们注意看上面的代码,需要处理的内容和将处理方式是耦合在一起的,即下载共一个方法中的。现在不想打印输出数组中的每一个内容了,想要将数组中的每一个元素加上1之后再打印数组中的内容,那么此时就需要对上ProcessArray类进行修改了。
class ProcessArray
{
public void process(int[] target){
for(int temp : target){
Syetem.out.println(temp + 1);
}
}
}

如果还要更改功能就还需要对其中ProcessArray类进行修改。

那么,能不能做一个设想。将处理内容和处理的行为分割开来。即将proces()方法定义成如下形式
public void process(int[] target, 处理行为)
{
处理行为来处理数组的内容。
}

我们将处理行为抽象成一个接口:
interface Command
{
//在这个接口类定义一个抽象的处理int数组的方法
void process(int[] target);
}
那么具体的处理方法可以通过实现类来实现
class PrintCommand implements Command//打印每一个数组元素
{

public void process(int[] target){
	for (int temp : target){
		System.out.println(temp);
	}
}

}

//将每一个数组元素打印输出
class AddCommand implements Command
{
public void process(int[] target){
for (int temp : target){
System.out.println(temp + 1);
}
}
}

//此时在定义专门用来处理数组的ProcessArray类
class ProcessArray
{
public void process[int[] target, Command c){
c.process(target);
}
}

public class Test
{

public static void main(String[] args){
	int[] target = {1, 2, 3, 4, 5};
	PrintCommand pc = new PrintCommand();
	AddCommand ac = new AddCommand();	
	ProcessArray pa = new ProcessArray();
	pa.process(target, pc);//打印
	pa.process(target, ac);//加一后打印
}

}

我们利用Command接口将ProcessArray类和具体的处理指令(PrintCommand,AddCommand)完全分隔开了。

此时我们再来看命令指令的设计模式:
将方法的具体处理指令和需要处理的内容完全分割开了,避免耦合。
适用场景:
某个方法需要完成某一个行为,但这个行为的具体实现无法确定,必须等到执行该方法时才可以确定。简单的理解,即将处理指令的代码利用接口打包成一个参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值