命令模式(Command)
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化
在GoF23种设计模式中,属于行为型模式( Behavioral Patterns)
。
所谓参数化就是通过不同的命令参数,去发送对客户的请求。
命令模式通过封装请求,将命令的使用者与执行者解耦。使用者只用关系命令的下达与结果,而执行者只需关心执行的过程与处理,而不在乎其在何处被执行。
形象来说,你向外卖平台发送了下单命令,平台执行了下单命令,合理选择了配送员及配送路线,最终你在家门口收到了外卖。命令模式就是把你和平台的通信进行解耦,让你只关注外卖的送达与品尝,如何配送怎么送达?这些处理过程与你点外卖行为进行解耦。
- 优点
- 降低系统耦合
- 易拓展新的命令
- 缺点
- 命令较多时会增加系统复杂度
- 使用场景
- 请求者与执行者需要解耦时
实例
角色说明
- Command
- 命令统一接口声明
- ConcreteCommand
- 具体命令
- 将接收者绑定在一个命令上
- Invoker
- 命令执行者
- Receiver
- 知道如何实施与执行一个请求相关的操作
- Client
- 使用者
举例
假设我们有个家务机器人,我们可以通过命令模式让它执行家务劳动。
角色说明
- Command(Command)
- 命令接口
- WashclothesCommand(ConcreteCommand)
- 洗衣服
- CookCommand(ConcreteCommand)
- 做饭
- Robot(Invoker)
- 家务机器人
- Housework(Receiver)
- 家务类
- Client
- 使用者
code
- Command.java
public interface Command {
void execute(String name);
}
- WashClothesCommand.java
public class WashClothesCommand implements Command{
private Housework housework;
public WashClothesCommand(Housework housework) {
this.housework = housework;
}
@Override
public void execute(String name) {
housework.washClothes(name);
}
}
- CookCommand.java
public class CookCommand implements Command {
private Housework housework;
public CookCommand(Housework housework) {
this.housework = housework;
}
@Override
public void execute(String name) {
housework.cook(name);
}
}
- Robot.java
public class Robot {
private List<Command> commandList = new ArrayList<>();
private String robotName;
public Robot(String robotName) {
this.robotName = robotName;
}
public void addCommand(Command command) {
commandList.add(command);
}
public void execute() {
for (Command c : commandList) {
c.execute(robotName);
}
commandList.clear();
}
}
- Housework.java
public class Housework {
private String houseName;
public Housework(String houseName) {
this.houseName = houseName;
}
public void washClothes(String name) {
System.out.println(houseName + "家中," + name + "洗好了衣服");
}
public void cook(String name) {
System.out.println(houseName + "家中," + name + "做好了饭");
}
}
- Client.java
public class Client {
public static void main(String[] args) {
Robot robot = new Robot("未来机器人1号");
Housework housework = new Housework("ordin");
//下命令
robot.addCommand(new WashClothesCommand(housework));
robot.addCommand(new CookCommand(housework));
//执行
robot.execute();
}
}
- output
ordin家中,未来机器人1号洗好了衣服
ordin家中,未来机器人1号做好了饭
实例
- code
- java.util.concurrent.ThreadPoolExecutor
- java.lang.Runnable
这里的Runnable接口可看做命令接口,我们可以通过线程池来批量执行Runnable命令,而具体的命令内容可以由我们自定义实现。
总结
命令模式通过解耦请求者与执行者逻辑,从而降低系统耦合,利于系统拓展。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: