zoukankan      html  css  js  c++  java
  • 命令模式

    参考:http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html

    命令模式的结构
      命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。
    
      每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
    
      命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:
    
      (1)命令模式使新的命令很容易地被加入到系统里。
    
      (2)允许接收请求的一方决定是否要否决请求。
    
      (3)能较容易地设计一个命令队列。
    
      (4)可以容易地实现对请求的撤销和恢复。
    
      (5)在需要的情况下,可以较容易地将命令记入日志。
    
      下面以一个示意性的系统,说明命令模式的结构。

     命令模式涉及到五个角色,它们分别是:
    
      ●  客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。
    
      ●  命令(Command)角色:声明了一个给所有具体命令类的抽象接口。
    
      ●  具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
    
      ●  请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
    
      ●  接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

    /DesignPatterns/src/com/louis/command/Receiver.java

    /**
     * Project Name:DesignPatterns
     * File Name:Receiver.java
     * Package Name:com.louis.command
     * Date:2017年11月5日下午9:48:44
     * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
     *
    */
    
    package com.louis.command;
    /**
     * ClassName:Receiver 
     * Function: TODO ADD FUNCTION. 
     * Reason:     TODO ADD REASON. 
     * Date:     2017年11月5日 下午9:48:44 
     * @author   michael
     * @version  
     * @since    JDK 1.7
     * @see      
     */
    public class Receiver {
        public void action(){
            System.out.println("执行操作");
        }
    
    
    }

    /DesignPatterns/src/com/louis/command/Command.java

    /**
     * Project Name:DesignPatterns
     * File Name:Command.java
     * Package Name:com.louis.command
     * Date:2017年11月5日下午9:50:23
     * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
     *
    */
    
    package com.louis.command;
    /**
     * ClassName:Command 
     * Function: TODO ADD FUNCTION. 
     * Reason:     TODO ADD REASON. 
     * Date:     2017年11月5日 下午9:50:23 
     * @author   michael
     * @version  
     * @since    JDK 1.7
     * @see      
     */
    public interface Command {
        //执行方法
        void execute();
    }

    /DesignPatterns/src/com/louis/command/ConcreteCommand.java

    /**
     * Project Name:DesignPatterns
     * File Name:ConcreteCommand.java
     * Package Name:com.louis.command
     * Date:2017年11月5日下午9:51:01
     * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
     *
    */
    
    package com.louis.command;
    /**
     * ClassName:ConcreteCommand 
     * Function: TODO ADD FUNCTION. 
     * Reason:     TODO ADD REASON. 
     * Date:     2017年11月5日 下午9:51:01 
     * @author   michael
     * @version  
     * @since    JDK 1.7
     * @see      
     */
    public class ConcreteCommand implements Command {
    
        //持有相应的接收者对象
        private Receiver receiver = null;
        public ConcreteCommand(Receiver receiver){
            this.receiver = receiver;
        }
        @Override
        public void execute() {
            //通常会转调接收者对象的相应方法,让接受者来真正执行功能
            receiver.action();
    
        }
    
    }

    /DesignPatterns/src/com/louis/command/Invoker.java

    /**
     * Project Name:DesignPatterns
     * File Name:Invoker.java
     * Package Name:com.louis.command
     * Date:2017年11月5日下午9:59:08
     * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
     *
    */
    
    package com.louis.command;
    /**
     * ClassName:Invoker 
     * Function: TODO ADD FUNCTION. 
     * Reason:     TODO ADD REASON. 
     * Date:     2017年11月5日 下午9:59:08 
     * @author   michael
     * @version  
     * @since    JDK 1.7
     * @see      
     */
    public class Invoker {
        //持有命令对象
        private Command command = null;
        
        //构造方法
        public Invoker(Command command){
            this.command = command;
        }
        //行动方法
        public void action(){
            command.execute();
        }
    }

    /DesignPatterns/src/com/louis/command/Client.java

    /**
     * Project Name:DesignPatterns
     * File Name:Client.java
     * Package Name:com.louis.command
     * Date:2017年11月5日下午10:01:07
     * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
     *
    */
    
    package com.louis.command;
    /**
     * ClassName:Client 
     * Function: TODO ADD FUNCTION. 
     * Reason:     TODO ADD REASON. 
     * Date:     2017年11月5日 下午10:01:07 
     * @author   michael
     * @version  
     * @since    JDK 1.7
     * @see      
     */
    public class Client {
        public static void main(String[] args) {
            //创建接收者
            Receiver receiver = new Receiver();
            //创建命令对象,设定它的接受者
            Command command = new ConcreteCommand(receiver);
            //创建请求者,把命令对象设置进去
            Invoker invoker = new Invoker(command);
            //执行方法
            invoker.action();
        }
    }

    AudioPlayer系统

    参考:http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html

    宏命令

    参考:http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html

  • 相关阅读:
    django urls.py 中的name 使用方法
    django ForeignKey ManyToMany 前后端联动
    python web django 2nd level -- 待更新
    python web django base skill
    python-线程池的两种实现方式 【转载】
    django removing hardcoded URLs in template --- 使用变量,把url放在变量中 {% url 'namespace:name' %}
    django admin后台(数据库简单管理后台)
    windows10 -- mysql5.5 + python3.4 + django1.11 +pycharm2016.2 + PyMySQL(DB DRIVER) 环境搭建
    JavaScript可视化运行工具推荐
    为什么需要在 React 类组件中为事件处理程序绑定this?
  • 原文地址:https://www.cnblogs.com/Michael2397/p/7789194.html
Copyright © 2011-2022 走看看