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

原创 2018年04月17日 20:20:21

命令模式

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

命令模式中的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

C++不足之处讨论系列(四)--函数重载

以下文章翻译自Ian Joyner所著的《C++?? A Critique of C++ and Programming and Language Trends of the 1990s》 3/E【I...
  • cber
  • cber
  • 2001-05-21 23:26:00
  • 1227

Java开发中的23种设计模式详解----命令模式(Command)

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其...
  • sjyttkl
  • sjyttkl
  • 2017-06-21 12:23:41
  • 1604

设计模式之禅之混编【命令模式+责任链模式】

设计模式之禅之混编 命令模式+责任链模式 搬移UNIX命令 在Windows系统上使用UNIX命令 UNIX命令 命令名 选项 操作数 UNIX规定 ...
  • eieiei438
  • eieiei438
  • 2018-01-13 12:46:04
  • 285

浅谈JAVA设计模式之——命令模式(Command)

一、概述 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 二、适用性 1.抽象出待执行的动作以参数化某对象。 2.在不同的时刻指...
  • l1028386804
  • l1028386804
  • 2015-05-08 00:22:36
  • 4343

Java设计模式之命令模式

继续23种设计模式系列,本文介绍命令模式。
  • jason0539
  • jason0539
  • 2015-04-19 08:31:28
  • 22786

设计模式——命令模式实现undo、redo

设计模式——命令模式实现undo、redo 本文主要参考文章《命令模式场景之undo》 实现一个简单的undo、redo功能。比如数据库插入后想进行撤销操作。同时进行多个操作后进行撤销操作。 p...
  • wild46cat
  • wild46cat
  • 2016-07-05 10:49:08
  • 1352

大话设计模式—命令模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该...
  • lmb55
  • lmb55
  • 2016-04-03 20:18:28
  • 1484

java设计模式 命令模式的优点

命令模式的优点: 1. 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合. 2. 命令模式满足"开-闭"原则. 如果增加新的具体命令和该命...
  • fujianianhua
  • fujianianhua
  • 2011-12-28 20:31:56
  • 2176

设计模式 - 命令模式(command pattern) 撤销(undo) 详解

命令模式(command pattern) 撤销(undo) 详解本文地址: http://blog.csdn.net/caroline_wendy参考命令模式: http://blog.csdn.n...
  • u012515223
  • u012515223
  • 2014-06-16 19:43:54
  • 3194

设计模式初探-命令模式(COMMAND),又称动作(Action),事务(Transaction)

命令模式(COMMAND),又称动作(Action),事务(Transaction),通过将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,实现对请求排队或记录请求日志,以及支持可撤销...
  • a137268431
  • a137268431
  • 2014-03-03 20:54:45
  • 1159
收藏助手
不良信息举报
您举报文章:java设计模式(1):命令模式
举报原因:
原因补充:

(最多只允许输入30个字)