Gof23种设计模式(16)——命令模式(Command)

2020年8月14日10:21:31 评论 59

1 基础知识

1.1 标准定义

命令(Command)模式标准定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

1.2 分析和说明

命令(Command)模式属于对象行为型模式。命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

命令(Command)模式结构如图1所示,其角色包括客户(Client)角色、命令(Command)角色、具体命令(Concrete Command)角色和接收者(Receiver)角色。

Gof23种设计模式(16)——命令模式(Command)

图1命令模式结构

 客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。

 命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个Java接口或Java抽象类实现。

 具体命令(Concrete Command)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。

 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

2 应用场景举例

比如公司的一位管理者要对下属安排工作,就可以通过命令模式。管理者是客户角色:命令角色是一个抽象类:安排工作就是具体命令角色,具体包括要求编写工作计划、上报工作报告等。下属就是接收者角色。比如说老李这个管理者安排小王编写工作计划和上报工作报告。用例见图2。

Gof23种设计模式(16)——命令模式(Command)

图2 命令模式用例图

在这里可以把Manager类理解为客户(Client)角色。Command抽象类是命令(Command)角色。Computer是一种抽象产品(Product)角色。PlanCommand类和ReportCommand类是具体命令(Concrete Command)角色。Subordinate类是接收者(Receiver)角色。其实现类图如图3所示。Manager类聚合Command抽象类,Command抽象类聚合Subordinate类,PlanCommand类和ReportCommand类继承Command抽象类。

Gof23种设计模式(16)——命令模式(Command)

图3命令模式类图

命令模式实现顺序图见图4,实现顺序描述:
①基于Subordinate类创建一个subordinate对象。
②基于Manager类创建一个manager对象。
③基于ReportCommand类创建一个command1对象;
④调用command1对象的setMan方法,把subordinate对象赋值给command1对象;
⑤调用manager对象的setCommand方法,把command1对象赋值给manager对象;
⑥调用manager对象的executeCommand方法,subordinate对象执行命令。

Gof23种设计模式(16)——命令模式(Command)
图4 命令模式实现顺序图

3.Java的实现程序代码

Java程序实现主要包括Command类文件,Manager类文件,Subordinate类文件,PlanCommand类文件和ReportCommand类文件等5个文件。其关系如图3所示。下面分别列出这5个文件的程序代码,最后列出测试代码并显示输出结果。

Command抽象类程序代码清单01所示。

程序代码清单01

public abstract class Command {

	protected Subordinate man;

	public void setMan(Subordinate man) {
		this.man = man;
	}

	public void execute() {
	}
}

Manager类程序代码清单02所示。

程序代码清单02

public class Manager {

	private Command command;

	public void setCommand(Command command) {
		this.command = command;
	}

	public void executeCommand() {
		command.execute();
	}
}

Subordinate类程序代码清单03所示。

程序代码清单03

public class Subordinate {

	private String name;

	public Subordinate(String subordinateName) {
		name = subordinateName;
	}

	public String getName() {
		eturn name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void executeCommand(String task) {
		System.out.println(name + "执行" + task + "的命令");
	}
}

PlanCommand类和ReportCommand 类继承Command抽象类,其程序代码清单04所示。

程序代码清单04

public class PlanCommand extends Command {

	public void execute() {
		System.out.println("——————编写计划——————");
		man.executeCommand("编写计划");
	}
}

public class ReportCommand extends Command {

	public void execute() {
		System.out.println("——————编写报告——————");
		man.executeCommand("编写报告");
	}
}

命令模式测试程序的代码清单05如下:

程序代码清单05

public class Client {

	// 可以分为两个场景来处理
	public static void main(String[] args) {

		Subordinate subordinate = new Subordinate("小刘");
		
		Command command1 = new ReportCommand();
		command1.setMan(subordinate);

		Manager manager = new Manager();
		manager.setCommand(command1);
		manager.executeCommand();

		Command command2 = new PlanCommand();
		command2.setMan(subordinate);

		manager.setCommand(command2);
		manager.executeCommand();
	}
}

命令模式测试类输出结果如下所示:

——————编写报告——————
小刘执行编写报告的命令
——————编写计划——————
小刘执行编写计划的命令

参考链接

11种行为型模式

Gof23种设计模式(13)——解释器模式(Interpreter)
Gof23种设计模式(14)——模板方法模式(Template Method)
Gof23种设计模式(15)——责任链模式(Chain of Responsibility)
Gof23种设计模式(16)——命令模式(Command)
Gof23种设计模式(17)——迭代器模式(Iterator)
Gof23种设计模式(18)——中介者模式(Mediator)
Gof23种设计模式(19)——备忘录模式(Memento)
Gof23种设计模式(20)——观察者模式(Observer)
Gof23种设计模式(21)——状态模式(State)
Gof23种设计模式(22)——策略模式(Strategy)
Gof23种设计模式(23)——访问者模式(Visitor)
Gof23种设计模式 —— 行为型模式总结和比较

回到总目录Gof23种设计模式(全解析)

(转载自微信公众号:架构设计模式)

素课网
  • 本文由 发表于 2020年8月14日10:21:31
  • 转载请注明:https://www.suketech.com/9280.html
设计模式:面向对象设计的六大原则 - 总结 设计模式

设计模式:面向对象设计的六大原则 – 总结

开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: