Command Pattern

 

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

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

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);
						}
				});
		}
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
命令模式(Command Pattern)是一种行为设计模式,它将请求和实际执行该请求的操作解耦,使得请求的发送者和接收者不直接交互。该模式通过将请求封装成一个对象,从而可以对请求进行参数化、队列化、记录日志、撤销和重做等操作。 在命令模式中,有四个核心角色: - Command(命令):声明执行操作的接口。 - ConcreteCommand(具体命令):实现命令接口,负责执行具体的操作。 - Receiver(接收者):负责实际执行操作的对象。 - Invoker(调用者):负责调用命令对象并执行相应的操作。 下面是一个使用 Java 实现的命令模式示例: ```java // 定义命令接口 interface Command { void execute(); } // 具体命令类 class ConcreteCommand implements Command { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { receiver.action(); } } // 接收者类 class Receiver { public void action() { System.out.println("Receiver: 执行操作"); } } // 调用者类 class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } public class Main { public static void main(String[] args) { // 创建接收者对象 Receiver receiver = new Receiver(); // 创建具体命令对象,并指定接收者 Command command = new ConcreteCommand(receiver); // 创建调用者对象,并设置命令 Invoker invoker = new Invoker(); invoker.setCommand(command); // 调用者执行命令 invoker.executeCommand(); } } ``` 在上述示例中,命令接口 `Command` 声明了一个 `execute` 方法,具体命令类 `ConcreteCommand` 实现了该接口并持有一个接收者对象。调用者类 `Invoker` 可以设置具体的命令,并通过调用 `executeCommand` 方法执行命令。执行命令时,调用者会委托具体的命令对象调用接收者的操作方法。这样就实现了命令的发送者和接收者的解耦,并且可以方便地扩展和管理命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值