博客
关于我
命令模式【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/

    你可能感兴趣的文章
    对于js中的this指向的深入理解
    查看>>
    杭电 2007 平方和与立方和(输入数据的大小顺序并不能默认)
    查看>>
    十大排序算法之三:插入排序(Python)
    查看>>
    利用Python实现循环队列
    查看>>
    十大排序算法之四:希尔排序(Python)
    查看>>
    利用递归实现二叉树的前中后序遍历(Python)
    查看>>
    A*寻路算法(Python)
    查看>>
    Python刷题输入输出
    查看>>
    冒泡排序又来啦(C/C++版本)
    查看>>
    python负数存储
    查看>>
    求二维数组中最大值的位置
    查看>>
    python中sort和sorted的区别
    查看>>
    防碰撞算法
    查看>>
    在vue中添加echarts
    查看>>
    vue中echart数据动态切换,一看就懂
    查看>>
    Python实现理解树,树的遍历,二分查找
    查看>>
    Python3.6爬虫记录
    查看>>
    搞清楚Spring Cloud架构原理的这4个点,轻松应对面试
    查看>>
    1月份2月份GitHub上最热门的23个Java开源项目
    查看>>
    maven安装
    查看>>