设计模式 ——命令模式

更新时间:2019-10-22 11:55:32 点击次数:1292次
命令模式简介
定义
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,对请求排队或记录请求日志,以及支持可撤销的操作

优点(摘自大话设计模式)
(1)比较容易地设计一个命令队列
(2)在需要的情况下,可以比较容易地将命令记入日志
(3)允许接受请求的以放决定是否要否决请求
(4)可以容易地实现对请求的撤销和重做,新增加的具体命令类不影响其他类

使用场景
需要抽象出待执行的操作,然后以参数的形式提供出来,类似于过程设计中的回调机制,而命令模式正式回调机制的一个面向对象的替代品

需要支持事务操作

实例
根据上面的介绍,命令模式需要一个命令的接口类+具体的命令类+命令的管理或调度类+执行者

public interface Command {
    void execute();
}

具体命令

public class ConcreteCommand implements Command{

    Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        receiver.action();
        System.out.println("执行了具体命令");
    }
}

命令接收者

public class Receiver {
    String name;

    public Receiver(String name) {
        this.name = name;
    }

    public void action() {
        System.out.print(name);
    }
}

public class Invoker {
    List<Command> commands;

    public void addCommands(Command command) {
        if (commands == null)
            commands = new ArrayList<>();
        commands.add(command);
    }

    public void cancelCommand(Command command) {
        if (commands == null || commands.isEmpty()) return;
        commands.remove(command);
    }

    public void execute() {
        if (commands == null || commands.isEmpty()) return;
        for (Command command : commands) {
            command.execute();
        }
    }
}


测试调用类

public class Test {
    public static void main(String[] args) {
        Receiver receiver=new Receiver("小明");
        ConcreteCommand concreteCommand=new ConcreteCommand(receiver);
        Invoker invoker=new Invoker();
        invoker.addCommands(concreteCommand);
        invoker.execute();
    }
}

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!