• 行为型模式之命令模式


    命令模式(Command Pattern)又称为行动(Action)模式或交易(Transaction)模式。

    定义:

    • 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。

    命令模式类图如下所示。

    命令模式中有如下4个角色。

    • 命令(Command)角色:声明一个所有具体命令类的抽象接口,定义需要执行的命令。
    • 具体命令(Concrete Command)角色:定义一个接收者和行为之间的弱耦合,实现命令方法,并调用接收者的相应操作。
    • 调用者(Invoker)角色:负责调用命令对象执行请求。
    • 接收者(Receiver)角色:负责具体实施和执行一个请求。

     Command.java

    public interface Command {
        // 执行命令的方法
        public void execute();
    }

    ConcreteCommand.java

    public class ConcreteCommand implements Command{
        private Receiver receiver;
        public ConcreteCommand(Receiver receiver) {
            this.receiver = receiver;
        }
        // 执行方法
        @Override
        public void execute() {
            this.receiver.action();
        }
    }

    Receiver.java

    public class Receiver {
        // 行动方法
        public void action() {
            System.out.println("执行动作");
        }
    }

    Invoker.java

    public class Invoker {
        private Command command;
        // 接收命令
        protected void setCommand(Command command) {
            this.command = command;
        }
        // 执行命令
        public void action() {
            this.command.execute();
        }
    }

    Client.java

    public class Client {
        public static void main(String[] args) {
            // 调用者
            Invoker invoker = new Invoker();
            // 接收者
            Receiver receiver = new Receiver();
            // 定义一个发送给接收者的命令
            Command command = new ConcreteCommand(receiver);
            // 执行
            invoker.setCommand(command);
            invoker.action();
        }
    }

    优点:

    • 类间解绑。调用者角色与接收者角色之间没有任何依赖,调用者实现功能时只需调用Command中的execute()方法即可,不需要了解是哪个接收者执行。
    • 可扩展性。Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合。
    • 命令模式结合其他模式会更优秀。命令模式可以结合责任链模式,实现命令族解析任务,结合模板实现方法,则可以减少Command子类的膨胀问题。

    缺点:

    • 可能会导致系统中出现过多的具体命令类,因此需要在项目中慎重考虑使用。

    应用场景:

    • 只要你认为是命令的地方就可以采用命令模式,例如,在GUI开发中,一个按钮的点击
      是一个命令,可以采用命令模式;模拟DOS命令的时候,当然也要采用命令模式;触发-反
      馈机制的处理等。

    摘自:

    青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,142-146.

    秦小波 . 设计模式之禅 . 机械工业出版社, 2014

  • 相关阅读:
    文摘
    Maximal Square leetcode
    Majority Element II
    Merge k Sorted Lists leetcode
    学习方法-暗时间
    4sum leetcode
    valid parentheses
    两道考研算法设计题- 2010 2013
    regular expression matching DP
    valid sudoku leetcode
  • 原文地址:https://www.cnblogs.com/yewen1234/p/10070349.html
Copyright © 2020-2023  润新知