Command Pattern

本文深入探讨了命令模式的设计理念及其在Java中的实现方式。通过实例展示了如何利用命令模式将请求封装为对象,从而实现请求发送者与接收者的解耦。特别适用于需要在运行时指定请求的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

所谓命令模式本质上讲就是对请求的封装:

那我们在什么时候使用呢?

1 如果需要执行的动作需要被抽取出来

2 需要在不同的时刻指定请求

 

其实命令式最主要的作用还是用于类之间的解耦。

结构图:



 示例代码:

package Proxy.command;

public class Invoker {
	//调用哪一个命令
	private Command command;

	public void setCommand(Command command) {
		this.command = command;
	}
	
	public Command getCommand() {
		return command;
	}
	//执行命令
	public void execute (){
		getCommand().action();
	}
}

 

package Proxy.command;

public interface Command {
	void action();
}

 

package Proxy.command;

public class ConcreateCommand1 implements Command {
	private Receiver receiver;

	public ConcreateCommand1(Receiver receiver) {
		super();
		this.receiver = receiver;
	}

	@Override
	public void action() {
		this.receiver.execute();
	}

}

 

package Proxy.command;

public class ConcreateCommand2 implements Command {
	private Receiver receiver;

	public ConcreateCommand2(Receiver receiver) {
		super();
		this.receiver = receiver;
	}

	@Override
	public void action() {
		this.receiver.execute();
	}
}

 

package Proxy.command;

public class Invoker {
	//调用哪一个命令
	private Command command;

	public void setCommand(Command command) {
		this.command = command;
	}
	
	public Command getCommand() {
		return command;
	}
	//执行命令
	public void execute (){
		getCommand().action();
	}
}

 

package Proxy.command;

public class ReceiverA implements Receiver {

	@Override
	public void execute() {
		System.out.println("我是A接收者");
	}

}

 

package Proxy.command;

public class ReceiverB implements Receiver {
	@Override
	public void execute() {
		System.out.println("我是B接收者");
	}

}

 

package Proxy.command;

public class ReceiverC implements Receiver {
	@Override
	public void execute() {
		System.out.println("我是C接收者");
	}
}

 

package Proxy.command;

public class Client {
	public static void main(String[] args) {
		//先声明调用者
		Invoker invoker = new Invoker();
		//定义接受者
		Receiver receiver = new ReceiverB();
		//定义一个具体的命令
		Command command = new ConcreateCommand1(receiver);
		invoker.setCommand(command);
		invoker.execute();
	}
}

 

现在有这样的一个应用场景:

我现在需要定义一个方法,这个方法内部大部分功能或者步骤已经确定,但是有小部分不能确定,也就是所谓的动态代码。

举个列子,我现在在方法内部处理一个数组对象,但是数组对象的处理方式并不是确定的,需要根据调用的时候才能确定。

但是Java又不支持直接传入一个java 代码块给方法,怎么办呢?

所以我们有必要对这部分代码进行封装,但是封装的方法也不允许独立存在,在Java 世界,类才是一等的。所以我们实际

传到该方法的是一个对象。该对象通常是一个接口的匿名子类。该接口通常称为命令接口,这种设计模式也称为命令模式。

 

 

public class ProcessArray {
		//Command用于处理数组的逻辑
		public void iterateArray(int[] target,Command command){
				command.process(target);
		}
}

 

 

//Command 接口
public interface Command {
		public abstract void process(int[] target);
}

 具体完整的示例代码:

 

public class ProcessArrayTest {
		public static void main(String[] args) {
				ProcessArray processArray = new ProcessArray();
				int [] target = {1,3,5,7,9,11};
				//第一次处理数组
				processArray.iterateArray(target, new Command() {
						public void process(int[] target) {
								for(int tmp : target){
										System.out.println("current element:"+tmp);
								}
						}
				});
				//第二次处理数组
				
				processArray.iterateArray(target, new Command() {
						public void process(int[] target) {
								int sum = 0;
								for(int tmp : target){
										sum += tmp;
								}
								System.out.println("Total :"+sum);
						}
				});
		}
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值