命令模式【Command Pattern】
发布日期:2021-05-08 00:09:35 浏览次数:16 分类:精选文章

本文共 1754 字,大约阅读时间需要 5 分钟。

命令模式(Command Pattern)是一种设计模式,用于将请求分解为一系列命令,分别由对应的接收者执行。这种模式将请求方(Invoker)和执行方(Receiver)分开,使得系统更加灵活和可扩展。

命令模式的核心概念

  • Command(命令):定义了一个操作的接口,子类实现具体的操作逻辑。
  • Receiver(接收者):负责执行命令,通常是具体的操作实现类。
  • Invoker(调用者):接收命令并执行,通常是高层次的调用者,如项目经理。
  • 命令模式的实现

    在项目管理中,项目经理作为调用者(Invoker),接收客户的命令并分配给相应的组执行。每个组(如需求组、美工组、代码组)作为接收者(Receiver),负责执行特定的操作。

    优化后的代码示例

    // 命令的抽象类public abstract class Command {    // 定义三个组    protected RequirementGroup rg = new RequirementGroup();    protected PageGroup pg = new PageGroup();    protected CodeGroup cg = new CodeGroup();    // 每个命令都要实现的方法    public abstract void execute();}// 增加一项需求的命令public class AddRequirementCommand extends Command {    @Override    public void execute() {        rg.find();        rg.add();        pg.add();        cg.add();        rg.plan();    }}// 删除一个页面的命令public class DeletePageCommand extends Command {    @Override    public void execute() {        pg.find();        rg.delete();        cg.delete();        pg.plan();    }}// 项目接头人(调用者)public class Invoker {    private Command command;    // 接收命令    public void setCommand(Command command) {        this.command = command;    }    // 执行命令    public void action() {        command.execute();    }}// 客户端public class Client {    public static void main(String[] args) {        Invoker xiaoSan = new Invoker(); // 接头人        Command command = new AddRequirementCommand();        xiaoSan.setCommand(command);        xiaoSan.action();        // 同样可以创建DeletePageCommand并执行    }}

    优点

  • 高内聚:命令和接收者分开,减少了直接的依赖关系。
  • 可扩展性:新增命令只需创建新的Command子类,无需修改接收者。
  • 易于调试和维护:每个命令可以独立处理,方便排查问题。
  • 缺点

  • 类膨胀:大量的Command子类可能导致类结构复杂。
  • 性能开销:每次命令执行都可能带来一定的性能开销。
  • 应用场景

    • 需要频繁修改或撤销操作的系统。
    • 当直接调用具体实现会导致代码耦合时。
    • 需要支持多种操作类型,且操作可以被撤销或重做时。

    总结

    命令模式通过将操作封装为命令,使系统设计更加灵活和可维护。它将请求方和执行方分开,提升了系统的扩展性和可维护性,特别适用于需要频繁修改和撤销操作的项目管理场景。

    上一篇:保存/恢复Activity和Fragment状态的最佳实践(译)
    下一篇:深入浅出反射

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年04月06日 02时06分02秒