定义:
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
目的:
将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
何时使用:
在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。
如何解决:
通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。
关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口
主要涉及到以下几个核心角色:
命令(Command): 定义了执行操作的接口,通常包含一个 execute 方法,用于调用具体的操作。 具体命令(ConcreteCommand): 实现了命令接口,负责执行具体的操作。它通常包含了对接收者的引用,通过调用接收者的方法来完成请求的处理。 接收者(Receiver): 知道如何执行与请求相关的操作,实际执行命令的对象。 调用者/请求者(Invoker): 发送命令的对象,它包含了一个命令对象并能触发命令的执行。调用者并不直接处理请求,而是通过将请求传递给命令对象来实现。 客户端(Client): 创建具体命令对象并设置其接收者,将命令对象交给调用者执行。
// 定义士兵类 class Soldier { public void attack() { System.out.println("士兵发起进攻!"); } } // 定义长官类 class Commander { private Soldier soldier; public Commander(Soldier soldier) { this.soldier = soldier; } // 定义命令接口 interface Command { void execute(); } // 定义具体命令,即长官下达的命令 class AttackCommand implements Command { @Override public void execute() { soldier.attack(); } } // 设置命令 public void setCommand(Command command) { this.command = command; } // 发布命令 public void issueCommand() { command.execute(); } private Command command; } // 客户端 public class CommandPatternExample { public static void main(String[] args) { // 创建士兵 Soldier soldier = new Soldier(); // 创建长官,并指定士兵 Commander commander = new Commander(soldier); // 创建具体命令对象,并设置给长官 Commander.Command command = commander.new AttackCommand(); commander.setCommand(command); // 长官发布命令 commander.issueCommand(); } }
代码运行截图
上一篇:线性代数的艺术