Skip to content

Latest commit

 

History

History
103 lines (82 loc) · 2.69 KB

设计模式-Command.md

File metadata and controls

103 lines (82 loc) · 2.69 KB

Command(命令模式)

概述

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

使用

示例

我们来模拟一下辣条厂中,小组长命令员工去工作的场景。

实现

  1. 创建一个命令处理接口
public interface Receiver {

    void action(String desc);
}
  1. 员工实现接口处理命令
public class Employee implements Receiver {

    @Override
    public void action(String desc) {
        System.out.println("Employee 执行命令:" + desc);
    }
}
  1. 创建命令接口
public interface Command {
    
    void execute(String desc);
}
public class WorkCommand implements Command {

    private Receiver receiver;

    public WorkCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute(String desc) {
        receiver.action(desc);
    }
}
  1. 创建发送命令的小组长
public class Leader implements Receiver {

    private Command command;

    public Leader(Command command) {
        this.command = command;
    }

    @Override
    public void action(String desc) {
        command.execute(desc);
    }
}
  1. 测试
public class CommandTest {

    @Test
    public void testCommand() {
        Receiver receiver = new Employee();//创建命令接受者
        Command command = new WorkCommand(receiver);//创建命令
        Leader leader = new Leader(command);//创建命令发送者
        leader.action("去工作");//发送命令
    }
}
  1. 输出
03-23 11:53:42.221 31493-31521/? I/System.out: Employee 执行命令:去工作

从输出信息可以看出,最后员工执行了命令去工作了。

使用场景

认为是命令的地方都可以使用命令模式,比如: 1. GUI 中每一个按钮都是一条命令。 2. 模拟 CMD。

主要解决

在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

一次设定,统一执行(与责任链相反)。

优点

  1. 降低了系统耦合度。
  2. 新的命令可以很容易添加到系统中去。

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。

注意事项

系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式。