首页 > 其他 > 详细

命令模式

时间:2017-11-05 23:20:21      阅读:382      评论:0      收藏:0      [点我收藏+]

 

参考: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

命令模式

原文:http://www.cnblogs.com/Michael2397/p/7789194.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!