博客
关于我
命令模式【Command Pattern】
阅读量:356 次
发布时间:2019-03-05

本文共 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子类可能导致类结构复杂。
  • 性能开销:每次命令执行都可能带来一定的性能开销。
  • 应用场景

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

    总结

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

    转载地址:http://iycg.baihongyu.com/

    你可能感兴趣的文章
    html2canvas vue页面截图生成图片地址
    查看>>
    copy_{to, from}_user()的思考
    查看>>
    Web前端安全策略之CSRF的攻击与防御
    查看>>
    5分钟快速了解下CSS4 color-adjust属性
    查看>>
    纯客户端页面关键字搜索高亮jQuery插件
    查看>>
    秋月何时了,CSS3 border-radius知多少?
    查看>>
    linux运维中常用的命令
    查看>>
    M1芯片的macbook安装王者荣耀,原神,崩坏方法
    查看>>
    CentOS7更改成阿里云的源
    查看>>
    Java温故而知新-反射机制
    查看>>
    Vue与Webpack配置、路由
    查看>>
    Netty3事件处理顺序问题
    查看>>
    eclipse引用sun.misc开头的类
    查看>>
    如何优雅地停止Java进程
    查看>>
    firefox中angular2嵌套发送请求问题
    查看>>
    Netty 知识整理 (2)HttpServerCodec和HttpObjectAggregator用法
    查看>>
    【Linux】service命令
    查看>>