zoukankan      html  css  js  c++  java
  • 学习设计模式之命令模式

    命令模式
    将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。

    类结构图
    在这里插入图片描述
    Invoker
    要求该命令执行这个请求。
    Command
    用来声明执行命令的接口。
    ConcreteCommand
    将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现 Execute。
    Receiver
    就是接收命令的角色具体实施一个请求的操作,任何类都可能作为一个接收者。

    代码示例
    这样就好比我们去饭馆吃饭。
    Receiver 就是具体处理我们命令的人好比厨师.
    Command 就像我们点菜的命令。
    Invoker 就好比服务员。我们来实现一下。

    public interface Command {
    
        void setReceiver(Receiver receiver);
    
        String getContent();
    
        void execute(Command command);
    }
    
    public interface Receiver {
        void action(Command command);
    }
    
    public class ConcreteReceiver implements Receiver {
        @Override
        public void action(Command command) {
            System.out.println("厨师 ConcreteReceiver 正在执行 " + command.getContent());
        }
    }
    
    public class Waiter {
        private List<Command> commands = new ArrayList();
    
        public void addCommand(Command command) {
            this.commands.add(command);
        }
    
        public void delCommand(Command command) {
            this.commands.remove(command);
        }
    
        public void executeCommand() {
            for (Command c : commands) {
                c.execute(c);
            }
        }
    }
    

    客户端示例

    public class Client {
        public static void main(String[] args) {
            Receiver receiver = new ConcreteReceiver();
            Command command = new Command() {
                private Receiver receiver;
    
                @Override
                public void setReceiver(Receiver receiver) {
                    this.receiver = receiver;
                }
    
                @Override
                public String getContent() {
                    return "西红柿炒鸡蛋!";
                }
    
                @Override
                public void execute() {
                    this.receiver.action(this);
                }
            };
            command.setReceiver(receiver);
            
            Waiter waiter = new Waiter();
            waiter.addCommand(command);
            waiter.executeCommand();
        }
    }
    

    运行结果

    厨师 ConcreteReceiver 正在执行 西红柿炒鸡蛋!
    
    Process finished with exit code 0
    

    优点
    代码解耦,调用者和接收者没有依赖关系,只需要了解到对应的 Command 即可不需要了解谁去做这个菜,怎么做这个菜。

    缺点
    类会变得很多,如果一个操作需要很多命令在一起,那么就需要实例化 N 个 Command 实现类。

  • 相关阅读:
    LeetCode-018-四数之和
    LeetCode-017-电话号码的字母组合
    LeetCode-016-最接近的三数之和
    LeetCode-015-三数之和
    LeetCode-014-最长公共前缀
    LeetCode-013-罗马数字转整数
    LeetCode-012-整数转罗马数字
    LeetCode-011-盛最多水的容器
    LeetCode-010-正则表达式匹配
    [leetcode]103. Binary Tree Zigzag Level Order Traversal二叉树Z形遍历
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961636.html
Copyright © 2011-2022 走看看