java设计模式:命令模式

命令模式(Command Patter):将请求、命令、动作封装成对象,这样可以让项目使用这些对象去参数化其他对象,使得命令的请求者和执行者解耦。像工作流activiti框架中就大量的使用了命令模式

命令模式一般可认为包括下面三个角色:

    1)请求者(invoker):即命令的发起方

    2)命令(command)类:一般使用抽象类或者接口定义command,以及实现该接口或继承该抽象类的实体类

    3)执行者(receiver):即命令的执行者

命令模式一般使用在命令的请求者和命令的执行者(接收者)之间互不相关的情况下,即请求者和执行者(接收者)之间的变化互不影响。例如开关和电器,这两者之间互不相干,开关刚买来的时候并不知道是具体用来操作哪个电器的,电器和开关的更新换代也互不影响,它们之间通过电线来相关联。在这个例子中,开关就是请求者,电线就是命令类,电器就是执行者(接收者)。


下面通过一个简单的例子来演示命令模式的原理:IDE的自定义操作按键功能

1、ide操作接口(接收者)

public interface IDEOperation {
    void deleteLine(); //删除行

    void copyLine(); //复制行

    void undoOperate(); //回退操作
}

2、ide操作实现类(接收者)

public class IDEOperationImpl implements IDEOperation{
    @Override
    public void deleteLine() {
        System.out.println("删除一行");
    }

    @Override
    public void copyLine() {
        System.out.println("复制一行");
    }

    @Override
    public void undoOperate() {
        System.out.println("回退操作");
    }
}

3、命令接口

public interface Command {
    void execute();
}

4、命令实现类

public class DeleteLineCommand implements Command {
    private IDEOperation ideOperation;

    public DeleteLineCommand(IDEOperation ideOperation) {
        this.ideOperation = ideOperation;
    }

    @Override
    public void execute() {
        ideOperation.deleteLine();
    }
}
public class CopyLineCommand implements Command {
    private IDEOperation ideOperation;

    public CopyLineCommand(IDEOperation ideOperation) {
        this.ideOperation = ideOperation;
    }

    @Override
    public void execute() {
        ideOperation.copyLine();
    }
}
public class UndoCommand implements Command {
    private IDEOperation ideOperation;

    public UndoCommand(IDEOperation ideOperation) {
        this.ideOperation = ideOperation;
    }

    @Override
    public void execute() {
        ideOperation.undoOperate();
    }
}

5、自定义按键的菜单(请求者)

public class Setting {
    private Command command;

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

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

    public void onKeyDown() {
        command.execute();
    }
}

6、测试类

public class MainTest {
    public static void main(String[] args){
        IDEOperation ideOperation = new IDEOperationImpl();
        DeleteLineCommand deleteLineCommand = new DeleteLineCommand(ideOperation);
        CopyLineCommand copyLineCommand = new CopyLineCommand(ideOperation);
        UndoCommand undoCommand = new UndoCommand(ideOperation);
        Setting setting = new Setting(deleteLineCommand);
        setting.onKeyDown();

        setting = new Setting(copyLineCommand);
        setting.onKeyDown();

        setting = new Setting(undoCommand);
        setting.onKeyDown();
    }
}

输出结果为:

删除一行
复制一行

回退操作


也可以通过在请求者中引用Command[] 来实现宏命令的效果,比如一键回退等这种操作,一般使用Statck栈的方式来做,即先进后出的方式,先通过push加入,回退操作的时候,通过pop依次循环回退之前的操作。操作比较简单,这里就不做演示了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值