设计模式_命令模式(21)

来源:互联网 发布:网络测试工程师 编辑:程序博客网 时间:2024/06/01 10:43
  • 什么是命令模式
  • 命令模式的例子
  • 命令模式的优缺点
  • 命令模式的使用场景
  • 闲言碎语

什么是命令模式

   我们想象一个场景:在军队中,我们要完成一场战斗.我们都知道,将军不可能跑到买个士兵面前去下达自己的命令.他一般都是安排给自己手下的副将.然后由自己的副将一级级去传达.根据士兵所处的位置和能力安培给他们相应的任务.当然在程序中我们也可能会遇到类似的问题.这时我们就要用到命令模式了.

  定义:将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。

  结构:

    抽象命令(Command):定义命令的接口,声明执行的方法。

    具体命令(ConcreteCommand):具体命令,实现要执行的方法,它通常是“虚”的实现;通常会有接收者,并调用接收者的功能来完成命令要执行的操作。

    接收者(Receiver):真正执行命令的对象。任何类都可能成为一个接收者,只要能实现命令要求实现的相应功能。

    调用者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

    客户端(Client):命令由客户端来创建,并设置命令的接收者。

  UML:



命令模式的例子

抽象命令的接口

package com.designPattern.command;/** * 命令(将军的的接口) *  * @author Jason * */public interface Command {// 发布命令public void sendOrder();}

命令的转发者,命令模式的核心

package com.designPattern.command;/** * 命令的转发者(可以认为是比将军低一级和多级的人) *  * @author Jason * */public class Invoker {private Command command;// 命令的传递public Invoker(Command command) {this.command = command;}public void action() {System.out.println("发布命令!");command.sendOrder();}}

命令的发布者

package com.designPattern.command;/** * 实际的命令发布者(将军) *  * @author Jason * */public class MyCommand implements Command {    private Receive receiver;    // 实际的命令执行者    public MyCommand(Receive receiver) {        this.receiver = receiver;    }    @Override // 发布命令    public void sendOrder() {        receiver.action();    }}}

命令执行者的接口

package com.designPattern.command;/** * 执行命令的接口(可以认为是士兵的抽象) *  * @author Jason * */public interface Receive {// 执行的方法public void action();}

具体的命令执行者

package com.designPattern.command;/** * 执行命令者(具体的士兵) *  * @author Jason * */public class Receiver implements Receive {// 执行命令public void action() {System.out.println("execute action!");}}
测试类
package com.designPattern.command;import org.junit.Test;/** * 测试类 *  * @author Jason * */public class Testcase {    @Test    public void test() {        // 实例化一个士兵        Receive receiver = new Receiver();        // 实例化一个将军并交个他一个士兵        Command cmd = new MyCommand(receiver);        // 实例化一个副将并为他指定已经将军        Invoker invoker = new Invoker(cmd);        // 向将军请求指令并且传达给小兵        invoker.action();    }}

命令模式的优缺点

  优点:1、降低了系统耦合度。2、新的命令可以很容易添加到系统中去。

  缺点:使用命令模式可能会导致某些系统有过多的具体命令类。

命令模式的使用场景

   认为是命令的地方都可以使用命令模式,比如:1、GUI 中每一个按钮都是一条命令。2、模拟 CMD。
闲言碎语

   在struts2中的action使用了命令模式.有兴趣的可以去看看.