一、概述

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

二、适用性

1.当抽象出待执行的动作以参数化某个对象的时候。

2.当需要在不同的时刻指定、排列和执行请求的时候。

3.当需要支持撤销操作的时候。

4.当需要支持修改日志的时候。系统崩溃时,这些修改可以重做一遍。

5.当用构建在原语操作上的高层操作构造一个系统的时候。

三、参与者

1.Command:声明执行操作的接口。

2.ConcreteCommand:将一个接收者对象绑定于一个动作。调用接收者相应操作来完成要执行的操作。

3.Client:创建一个具体命令对象并且设定它的接收者。

4.Invoker:要求该命令执行这个请求。

5.Receiver:知道如何实施和执行一个请求相关的操作。任何类都可能作为一个接收者。

四、类图

五、示例

Command

  1. package cn.lynn.command;
  2. public interface ICommand {
  3. public void execute();
  4. }

ConcreteCommand

  1. package cn.lynn.command;
  2. public class CommandImpl implements ICommand {
  3. private IMainBoard mainBoard;
  4. public CommandImpl(IMainBoard mainBoard) {
  5. this.mainBoard = mainBoard;
  6. }
  7. @Override
  8. public void execute() {
  9. mainBoard.open();
  10. }
  11. }

Invoker

  1. package cn.lynn.command;
  2. public class Box {
  3. private ICommand command;
  4. public void setCommand(ICommand command) {
  5. this.command = command;
  6. }
  7. public void openButtonPressed() {
  8. command.execute();
  9. }
  10. }

Receiver

  1. package cn.lynn.command;
  2. public interface IMainBoard {
  3. public void open();
  4. }
  1. package cn.lynn.command;
  2. public class AsusMainBoardImpl implements IMainBoard {
  3. @Override
  4. public void open() {
  5. System.out.println("华硕主板现在正在开机,请等候");
  6. System.out.println("接通电源......");
  7. System.out.println("设备检查......");
  8. System.out.println("装载系统......");
  9. System.out.println("机器正常运转起来......");
  10. System.out.println("机器已经正常打开,请操作");
  11. }
  12. }
  1. package cn.lynn.command;
  2. public class MsiMainBoardImpl implements IMainBoard {
  3. @Override
  4. public void open() {
  5. System.out.println("微星主板现在正在开机,请等候");
  6. System.out.println("接通电源......");
  7. System.out.println("设备检查......");
  8. System.out.println("装载系统......");
  9. System.out.println("机器正常运转起来......");
  10. System.out.println("机器已经正常打开,请操作");
  11. }
  12. }

Client

  1. package cn.lynn.command;
  2. public class Client {
  3. public static void main(String[] args) {
  4. IMainBoard mainBoard = new AsusMainBoardImpl();
  5. ICommand command = new CommandImpl(mainBoard);
  6. Box box = new Box();
  7. box.setCommand(command);
  8. box.openButtonPressed();
  9. }
  10. }

Result

  1. 华硕主板现在正在开机,请等候
  2. 接通电源......
  3. 设备检查......
  4. 装载系统......
  5. 机器正常运转起来......
  6. 机器已经正常打开,请操作

GoF23种设计模式之行为型模式之命令模式的更多相关文章

  1. GoF23种设计模式之行为型模式之状态模式

    一.概述         定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...

  2. GoF23种设计模式之行为型模式之策略模式

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1概述           定义一系列算法,把它们一个个都封装起来,并且让它们可以相互 ...

  3. GoF23种设计模式之创建型模式之原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...

  4. GoF23种设计模式之行为型模式之迭代器模式

    一.概述    给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.二.适用性1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候.2.当对聚合对象的多 ...

  5. GoF23种设计模式之行为型模式之解释器模式

    一.概述         给定一种语言和其文法的一种表示,再定义一个解释器,该解释器使用表示来解释语言中的句子. 二.适用性              当需要解释一种语言,并且可以将该语言中的句子表示 ...

  6. GoF23种设计模式之行为型模式之观察者模式

    一.概述        定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.二.适用性1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面的时 ...

  7. GoF23种设计模式之行为型模式之访问者模式

    概述 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用性 1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依 ...

  8. GoF23种设计模式之创建型模式之工厂方法模式

    一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...

  9. GoF23种设计模式之创建型模式之抽象工厂模式

    一.概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 二.适用性 1.一个系统要独立于它的产品的创建.组合和表示的时候. 2.一个系统要由多个产品系列中的一个来配置的时候. ...

  10. GoF23种设计模式之创建型模式之建造者模式

    一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...

随机推荐

  1. csdn自动展开+去广告+净化剪切板+免登陆(如有侵权,立即删博)

    对于csdn的广告大家想必......又没钱充VIP,怎么办,下面是脚本源码: 重要的事说三遍:如有侵权,立即删除!如有侵权,立即删除!如有侵权,立即删除! // ==UserScript== // ...

  2. 【手撸一个ORM】第五步、Expression(表达式目录树)转换为Where子句

    说明 在SQL中,查询.修改比较常用到WHERE子句,在这里根据使用场景不同,定义了两个类,一个用于查询,一个用于修改(插入)操作.原因是: 查询操作支持一级导航属性查询,如student.Schoo ...

  3. ASP.NET Core性能测试

    ASP.NET Core性能测试 应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关 ...

  4. 061 Rotate List 旋转链表

    给定一个链表,将链表向右旋转 k 个位置,其中 k 是非负数.示例:给定 1->2->3->4->5->NULL 且 k = 2,返回 4->5->1-> ...

  5. docker postgresql FATAL: could not access private key file "/etc/ssl/private/ssl-cert-snakeoil.key": Permission denied

    在docker中启动postgresql时出现错误 FATAL:  could not access private key file "/etc/ssl/private/ssl-cert- ...

  6. @PropertySource

    功能 加载指定的属性文件(*.properties)到 Spring 的 Environment 中.可以配合 @Value 和 @ConfigurationProperties 使用. @Prope ...

  7. IO(File、递归)

      第1章 File 1.1 IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下 ...

  8. Android 第三方库导致jar包冲突解决办法

    这几天的任务是将mapbox的工程合到程序中去,但是合并过程却出现了问题 合并方法: 在app的build.gradle中添加 dependencies { compile ('com.mapbox. ...

  9. 初识EditText - 自定义EditText形状

    EditText继承自TextView,是程序用于和用户进行交互的另一个重要控件,它允许用户在控件里输入和编辑内容,并可以在程序中对这些内容进行处理. 使用 android:hint属性来指定了一段提 ...

  10. Lodash.js常用拷贝

    lodash.js 降低 array.number.objects.string 等等的使用难度从而让 JavaScript 变得更简单.非常适用于:遍历 array.object 和 string: ...