设计模式—命令模式

命令模式

命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式

角色组成:抽象命令角色,具体命令角色,调用者角色,抽象接受者角色,具体接收者角色,客户端。

命令模式与策略模式的差异:

命令模式比策略模式多了一个接收者角色。

命令模式主要针对一串操作,而策略模式针对的是单个操作。可以理解命令模式是策略模式的多层级升级版本。

例子

  • 抽象命令类
package org.kouhao.design.patterns.命令模式;

/**
 * @author admin
 */
public abstract class AbstractCommand {
    IReceiver receiver;

    public AbstractCommand(IReceiver receiver) {
        this.receiver = receiver;
    }

    abstract void execute();
}

  • 接收者接口
package org.kouhao.design.patterns.命令模式;

/**
 * 接受者角色
 *
 * @author admin
 */
public interface IReceiver {
    void action();
}
  • 具体命令类1
package org.kouhao.design.patterns.命令模式;

/**
 * 增加需求命令
 *
 * @author admin
 */
public class AddRequirementCommand extends AbstractCommand {
    public AddRequirementCommand(IReceiver receiver) {
        super(receiver);
    }

    @Override
    void execute() {
        this.receiver.action();
    }
}
  • 具体命令类2
package org.kouhao.design.patterns.命令模式;

/**
 * 删除页面命令
 *
 * @author admin
 */
public class DeletePageCommand extends AbstractCommand {
    private IReceiver receiver;

    public DeletePageCommand(IReceiver receiver) {
        super(receiver);
    }

    @Override
    public void execute() {
        receiver.action();
    }
}
  • 接收者实现类1
package org.kouhao.design.patterns.命令模式;

/**
 * @author admin
 */
public class AddRequirementReceiver implements IReceiver {
    @Override
    public void action() {
        System.out.println("AddRequirementReceiver is doing.");
    }
}
  • 接收者实现类2
package org.kouhao.design.patterns.命令模式;

/**
 * @author admin
 */
public class DeletePageReceiver implements IReceiver{
    @Override
    public void action() {
        System.out.println("DeletePageReceiver is doing.");
    }
}
  • 调用者类
package org.kouhao.design.patterns.命令模式;

/**
 * @author admin
 */
public class Invoker {
    private AbstractCommand command;

    public void setCommand(AbstractCommand command) {
        this.command = command;
    }

    public void action() {
        this.command.execute();
    }
}
  • 客户端
package org.kouhao.design.patterns.命令模式;

/**
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        //首先声明调用者Invoker
        Invoker invoker = new Invoker();
        //定义接收者
        IReceiver receiver = new AddRequirementReceiver();
        //定义一个发送给接收者的命令
        AbstractCommand command = new AddRequirementCommand(receiver);
        //把命令交给调用者去执行
        invoker.setCommand(command);
        invoker.action();
    }
}
  • 输出

AddRequirementReceiver is doing.

posted @   弘一  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型
点击右上角即可分享
微信分享提示