• 命令模式(Command Pattern)


    参考文章:

    http://blog.csdn.net/u010843114/article/details/47857591

    定义:

     将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

    让发送者和接受者完全的松耦合,这样可大大增强程序的灵活性。

    uml类图:

    模式组成:

    • Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作
    • ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(Action)
    • Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作
    • Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。

     

    优点:

    • 降低系统的耦合度
    • 新的命令可以很容易地加入到系统中
    • 可以比较容易地设计一个命令队列和宏命令(组合命令)
    • 可以方便地实现对请求的Undo和Redo

    应用:

        • java.lang.Runnable
        • javax.swing.Action

    命令模式vs策略模式:

    • 策略模式对付的问题域通常是一个,就是说,多个策略只是处理同一个问题,而命令模式对付的是多个问题域,就是很多不同的命令来做不同的事情。

    举个栗子:

    定义命令的抽象角色

    interface ICommand {
        public void excute();
    }

    定义接收者

    class Cook {
        public void cookHotFishes() {
            System.out.println("开始做水煮鱼啦");
        }
    
        public void cookHotChicken() {
            System.out.println("开始做辣子鸡丁啦");
        }
    
        public void cleanPot() {
            System.out.println("刷锅啦");
        }
    }

    定义命令的具体实现

    class CommandHotFish implements ICommand {
        Cook cook;
    
        public CommandHotFish(Cook r) {
            this.cook = r;
        }
    
        @Override
        public void excute() {
            cook.cleanPot();
            cook.cookHotFishes();
        }
    }

    定义命令的具体实现

    class CommandHotChicken implements ICommand {
        Cook cook;
    
        public CommandHotChicken(Cook r) {
            this.cook = r;
        }
    
        @Override
        public void excute() {
            cook.cleanPot();
            cook.cookHotChicken();
        }
    }

    定义调用者

    class Invoker {
        private ICommand command;
    
        public void SetCommand(ICommand command) {
            this.command = command;
        }
    
        public void executeCommand() {
            command.excute();
        }
    }

    客户端调用

    public static void main(String[] args) {
            Cook cook=new Cook();
            List<ICommand> list=new ArrayList<ICommand>();
            list.add(new CommandHotFish(cook));
            list.add(new CommandHotChicken(cook));
            
            for(ICommand com:list){
                Invoker invoker=new Invoker();
                invoker.SetCommand(com);
                invoker.executeCommand();
            }
        }

    输出

  • 相关阅读:
    对象数组、集合、链表(java基础知识十五)
    正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)
    stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性(java基础知识十三)
    Scanner、String(java基础知识十二)
    开发工具、Object类(java基础知识十一)
    包、修饰符、内部类、匿名内部类(java基础知识十)
    获取cookies的简单代码(总结待续)
    多态、抽象类、接口、区别(java基础知识九)
    代码块、继承、this、super、final(java基础知识八)
    构造方法,重载,static,math类(java基础知识七)
  • 原文地址:https://www.cnblogs.com/amei0/p/7992620.html
Copyright © 2020-2023  润新知