java设计模式(1):命令模式

命令模式

在一些需求场景中,有发出命令的对象,有执行命令的对象,有具体的命令。但是如果要将这些模型抽象出来可以复用,这就是常见的命令模式。

命令模式中的5个角色

(1)调用者:负责调用命令对象,执行命令对象的方法

(2)执行者:具体执行某一方法

(3)抽象命令:一个接口或抽象类,让具体命令实现

(4)具体命令:实现抽象命令的具体方法

(5)客户端:创建具体的命令对象和其接受者,并执行请求


应用场景

        比如我现在在键盘上打字输入文本,我的角色就是客户端,键盘就是调用者,而电脑就是执行者,我在键盘上输入新增,撤销,恢复命令。就会在电脑上同步显示出来。整个过程就是命令模式。

        比如领导命令下属打印一份放假文件,领导就是调用者,下属就是执行者,打印一份文件就是抽象命令,打印具体的放假命令就是具体的命令。在这个命令模式中,领导不关心具体是哪个下属去打印,下属也不知道给哪位领导在打印,他能打印很多文件,当前这一刻他只打印一份放假的文件。这样耦合度更低。

代码示例


(1)调用者Invoker

public class Invoker {
	
	private Command command;
	
	// 构造注入
	public Invoker(Command command){
		this.command = command;
	}
	
	// 设值注入
	public void setCommand(Command command){
		this.command = command;
	}
	
	// 业务方法,用于调用命令类
	public void call(){
		command.execute();
	}
	
}

(2)执行者Receiver

public class Receiver {

	public void action(String action) {
		
		System.out.println(action);
		
	}

}

(3)抽象命令Command

public abstract class Command {
	
	public abstract void execute();
	
}

(4)具体命令

新增ConcreteCommandAdd

public class ConcreteCommandAdd extends Command{
	
	// 与请求接收者相关联
	private Receiver receiver;
	
	public ConcreteCommandAdd(Receiver receiver){
		this.receiver = receiver;
	}

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

}

恢复ConcreteCommandRedo

public class ConcreteCommandRedo extends Command{
	
	// 与请求接收者相关联
	private Receiver receiver;
	
	public ConcreteCommandRedo(Receiver receiver){
		this.receiver = receiver;
	}

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

}

撤销ConcreteCommandUndo

public class ConcreteCommandUndo extends Command{
	
	// 与请求接收者相关联
	private Receiver receiver;
	
	public ConcreteCommandUndo(Receiver receiver){
		this.receiver = receiver;
	}

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

}

(5)客户端Test

public class Test {
	
	public static void main(String[] args) {
		
		Receiver receiver = new Receiver();
		
		Command ccAdd = new ConcreteCommandAdd(receiver);	
		
		Command ccRedo = new ConcreteCommandRedo(receiver);
		
		Command ccUndo = new ConcreteCommandUndo(receiver);
		
		Invoker invokerccAdd = new Invoker(ccAdd);
		
		Invoker invokerccRedo = new Invoker(ccRedo);
		
		Invoker invokerccUndo = new Invoker(ccUndo);
		
		invokerccAdd.call();
		
		invokerccRedo.call();
		
		invokerccUndo.call();
		
	}
	
}

执行结果:

add action
redo action
undo action
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值