Java设计模式の命令模式

意图:

  将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作

动机:

  将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

效果:
  1)、command模式将调用操作的对象和实现该操作的对象解耦
  2)、可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
  3)、增加新的command很容易,无需改变已有的类

适用性:
  1)、抽象出待执行的动作以参数化某对象
  2)、在不同的时刻指定、排列和执行请求。如请求队列
  3)、支持取消操作
  4)、支持修改日志
  5)、用构建在原语操作上的高层操作构造一个系统。支持事物

参与者:
 1)、Command
  声明执行操作的接口
 2)、ConcreteCommand
  将一个接收者对象绑定于一个动作
  调用接收者相应的操作,以实现execute
 3)、Client
  创建一个具体命令对象并设定它的接收者
 4)、Invoker
  要求该命令执行这个请求
 5)、Receiver
  知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者

结构图:

协作:
  1)、client创建一个ConcreteCommand对象并指定它的Receiver对象
  2)、某Invoker对象存储该ConcreteCommand对象
  3)、该Invoker通过调用Command对象的execute操作来提交一个请求。若该命令是可撤销的,ConcreteCommand在执行execute操作前存储当前状态以用于取消该命令
  4)、ConcreteCommand对象调用它的Receiver的操作以执行该请求

命令对象将动作和接受者包进对象中,这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute()方法,请求的目的就能达到。

实现源码:

package com.blankjor.command;

/**
 * @desc 命令接口
 * @author Blankjor
 * @date 2017年5月20日 上午9:49:53
 */
public interface Command {
    /**
     * 执行命令
     */
    void excute();

    /**
     * 撤销命令
     */
    void undo();

}

package com.blankjor.command;

/**
 * @desc 真正命令执行者,接收者
 * @author Blankjor
 * @date 2017年5月20日 上午9:52:13
 */
public class Receiver {
    public void action() {
        System.out.println("正在执行命令...");
    }

    public void unAction() {
        System.out.println("正在撤销命令...");
    }

}

package com.blankjor.command;

/**
 * @desc 创建命令(可实现多条命令以及多个命令执行人)
 * @author Blankjor
 * @date 2017年5月20日 上午9:54:27
 */
public class CreateCommand implements Command {
    private Receiver receiver;

    /**
     * 初始化命令接收人
     *
     * @param receiver
     */
    public CreateCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void excute() {
        receiver.action();
    }

    @Override
    public void undo() {
        receiver.unAction();
    }

}

package com.blankjor.command;

/**
 * @desc 命令调用者
 * @author Blankjor
 * @date 2017年5月20日 上午9:59:05
 */
public class Invoker {
    private Command command;

    /**
     * 命令调用者持有该命令
     *
     * @param command
     */
    public Invoker(Command command) {
        this.command = command;
    }

    /**
     * 执行命令
     */
    public void runCommand() {
        command.excute();
    }

    /**
     * 撤销命令
     */
    public void unRunCommand() {
        command.undo();
    }
}

package com.blankjor.command;

/**
 * @desc 命令模式测试
 * @author Blankjor
 * @date 2017年5月20日 上午10:02:33
 */
public class TestMain {
    public static void main(String[] args) {
        // new 一个命令执行人
        Receiver receiver = new Receiver();
        // new 一条命令
        Command command = new CreateCommand(receiver);
        // 开始调用命令
        Invoker invoker = new Invoker(command);

        invoker.runCommand();
        invoker.unRunCommand();
    }

}

执行结果:

常见应用:
 1、工作队列,线程池,日程安排
 2、日志请求(系统恢复)
要点:
 1、命令模式将发出请求的对象和执行请求的对象解耦
 2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作
 3、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用
 4、调用者可以接受命令当作参数,甚至在运行时动态的进行
 5、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态
 6、宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销
 7、实际操作时,很常见使用"聪明"命令对象,也就是直接实现了请求,而不是将工作委托给接受者(弊端?)
 8、命令也可以用来实现日志和事物系统

参考:http://www.cnblogs.com/ikuman/archive/2013/08/06/3233092.html

时间: 2024-10-10 09:21:43

Java设计模式の命令模式的相关文章

Java设计模式-命令模式Command

定义 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于"行为请求者"与"行为实现者"解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. UML图: 角色 Command:定义命令的接口,声明执行的方法. ConcreteCommand:命令接口实现对象,是"虚"的实现:通常会持有接收者,并调用接收者的功能来完成命令要执行的操作. Receiver:接收者,真正执行命令的对象.任何类都可能成为一个接收者,

JAVA设计模式---命令模式

1.定义: 将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象,命令模式也支持可撤销的操作.命令可以用来实现日志和事务系统. 2.实例: 1)需求:设计一个家电遥控器的API,遥控器具有7个可编程的插槽,每个插槽都具有对应的开关按钮,另外还具备撤销按钮,用来撤销上一步的操作. 2)代码实现: a)命令实现 /* 遥控器命令接口,实现遥控器的动作 */ public interface Command { public void execute(); public void u

Java 设计模式 -- 复合模式之二

接着上文的鸭鸣例子:Java 设计模式 -- 复合模式之一 上文中,我们的鸭鸣实现了 装饰者模式  适配器模式  工厂模式的结合 现在,又需要进行改动了,上文,是可以统计一群鸭子的叫声,现在需要能够观察个别鸭子的行为 引入观察者模式: 任何想被观察的Quackable都必须实现下面的接口 public interface QuackObservable { public void registerObserver(Observer observer); public void notifyobs

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste

设计模式 - 命令模式(command pattern) 具体解释

命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对象, 以便使用不同的请求\队列\日志来參数化其它对象. 命令模式也能够支持撤销操作. 简单的命令模式的实现: 1. 详细的类, 每个类都有特定的方法: /** * @time 2014年6月9日 */ package command; /** * @author C.L.Wang * */ publ

设计模式 - 命令模式(command pattern) 详解

命令模式(command pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 命令模式: 将请求封装成对象, 以便使用不同的请求\队列\日志来参数化其他对象. 命令模式也支持可撤销操作. 命令模式: 调用者(Invoker); 命令(Command): 可执行方法(execute), 具体命令(Concrete Command); 接受者(Receiver): 调用命令(Set Command); 具体方法: 1. 具体对象. /** *

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理

设计模式 - 命令模式(command pattern) 多命令 详解

命令模式(command pattern) 多命令 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 具体步骤: 1. 多命令, 把未使用的命令, 初始化为空对象(NoCommand), 根据参数(slot), 选择输出命令. /** * @time 2014年6月16日 */ package command; /**

设计模式 - 命令模式(command pattern) 撤销(undo) 详解

命令模式(command pattern) 撤销(undo) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考命令模式: http://blog.csdn.net/caroline_wendy/article/details/31379977 命令模式可以用于执行撤销(undo)操作. 具体方法: 1. 对象类中需要保存状态, 如level. package command; public class CeilingFan { String loca