昨天看了下命令模式,有了点心得。
  先看一个典故:《后汉书·吕布传》:“诸将谓布曰:‘将军常欲杀刘备,今可假手于术。’”。
  命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。
  说白了,这种模式叫“假手于人”,借别人的手,来完成自己要做的事。
  本来自己可以直接做这件事,硬是在中间插上个第三者,由第三者来统一管理这些事情,好比公司总经理本来可以直接叫单位低层下属做事情的,但是现在就在二者之间插入部门经理,总经理要办事情,只要叫部门经理去就可以了,总经理只要知道是哪个人做什么事就可以了,没必要知道事情是什么时候、怎么做的。
  命令模式可以降低系统的耦合度,增强功能模块的复用性,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
  上面的话用公司的例子来说,就是如果有副总经理要叫低层下属做事,也可以直接找部门总管,这就是复用性,要增加部门的话,直接增加就可以,不会影响到别的部门的办公。
  下面我写个例子说明一下:
  //下属
  class Underling {
 
    public void action(String actionName)
    {
     System.out.println("I'm "+actionName+" now.");
    }

  }
  //抽象命令类
  abstract class Command {
 
    protected Underling underling;
    protected String commandName;
 
    public Command(Underling underling)
    {
      this.underling=underling;
    }
 
    abstract public void execute();

  }
  //命令--打印文件
  class PrintDocument extends Command {

   public PrintDocument(Underling underling) {
    super(underling);
    commandName="PrintDocument";
   }

   public void execute() {
  
    underling.action(commandName);
  
   }

  }
  //命令--取文件
  class FetchDocument extends Command {

    public FetchDocument(Underling underling) {
    super(underling);
    commandName="FetchDocument";
   }

   public void execute() {
  
    underling.action(commandName);
  
   }

  }
  //部门经理
  public class DepartmentlManage {
 
   private Command command;
 
   public DepartmentlManage(Command command)
   {
    this.command=command;
   }
 
   public void execCommand()
   {
    command.execute();
   }

  }
  //总经理
  public class GeneralManager {

   public static void main(String[] args) {
  
    Underling underling=new Underling();
    Command printDocument=new PrintDocument(underling);
    DepartmentlManage dm=new DepartmentlManage(printDocument);
    dm.execCommand();
   System.out.println("------------------");
   Command fetchDocument=new FetchDocument(underling);
    DepartmentlManage dm2=new DepartmentlManage(fetchDocument);
    dm2.execCommand();  
   }
  }
  运行结果如下:
  I'm PrintDocument now.
  ------------------
  I'm FetchDocument now.
  在上面例子中,总经理说叫下属underling去打印文件(PrintDocument),部门经理dm接到命令,执行,最后下属打印了文件。dm创建后,可以在任何时间执行命令。
  
  最后说说用command模式实现undo/redo功能。
  要实现undo功能,每个具体命令中要包含撤消命令的实现,命令管理类(相当于部门经理)中要能储存所有已经执行了的命令。要记住undo/redo到哪个地方的话,既可以用2个List,分别储存已经执行了2种不同操作的命令,也可以用一个指示变量,记住最后那个命令(就是指针嘛~~),二种方法要怎么用就看自己了。
  
  就到这里了。

转载于:https://www.cnblogs.com/zxub/archive/2005/06/19/177013.html

java设计模式学习3--Command Pattern[原创]相关推荐

  1. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  2. java设计模式学习笔记之装饰模式

    java设计模式学习笔记之装饰模式 尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697 这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧& ...

  3. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  4. Java - 设计模式学习总结

    熟练掌握各种设计模式,并能在实际编程开发中灵活运用它们,不仅能使代码更规范,重用性更高,同时也能保证代码的可靠性,提高开发效率.这段时间又系统看了设计模式的相关内容,整理学习总结如下,文中内容如有表达 ...

  5. Java 设计模式学习推荐

    基础知识 设计模式概述 从招式与内功谈起--设计模式概述(一):设计模式从何而来? 从招式与内功谈起--设计模式概述(二):设计模式是什么? 从招式与内功谈起--设计模式概述(三):设计模式有什么用? ...

  6. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  7. Java设计模式学习总结(16)——行为型模式之命令模式

    命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应 ...

  8. Java设计模式学习 - 模版方法模式策略模式

    个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...

  9. 【一】Java 设计模式学习记录: 工厂模式

    文章目录 一.设计模式的分类 二.工厂模式 2.1 简单工厂模式 2.1.1 解决的问题 2.1.2 简单工厂模式是什么 2.1.3 优缺点 2.2 工厂方法模式 2.2.1 解决的问题 2.2.2工 ...

  10. 设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...

最新文章

  1. H.265 HD 和H.265 4K Video Encoder IP Core
  2. 5G NPN 行业专网 — 解决方案
  3. HBase Shell常用的命令
  4. Java 线程池框架核心代码分析
  5. 基于MQTT协议进行应用开发
  6. 用python和sympy库解决方程组问题_Python语言 SymPy库数学方程问题——线性方程组篇...
  7. 一瓶可乐的自动售货机指令“旅程”
  8. python面试1000题之7-8
  9. 防盗链IHttpHandler
  10. 计算机网络与通信之物理层中的数据传输
  11. 【机器学习】二次规划
  12. html网页对账单样式,怎样在EXCEL中做工行对账单,样式字体要...
  13. 制作WIN_XP无人值守光盘
  14. Windows的Git Bash使用tree命令
  15. Linux基础知识汇总、有这一篇就够了(2021最新整理)
  16. QT实现串口调试助手(一)
  17. ElasticJob‐Lite:更换事件追踪数据源应用启动报错
  18. 外包一个小程序多少钱(外包小程序开发的价格费用)
  19. amd cpu排行_目前cpu排行榜(2020cpu性能排名对比)
  20. python如何实现图像中特定颜色的种类识别及特定颜色的占比代码

热门文章

  1. bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)
  2. C语言项目实战之简单的文本编辑器
  3. 任意进制的转换(C,C++)itoa函数,strtol函数,bitset函数,oct函数,dec函数,hex函数
  4. sort函数的使用(c++) bool函数使用
  5. [paper reading] YOLO v1
  6. python网络爬虫系列教程——python中requests库应用全解
  7. matlab2c使用c++实现matlab函数系列教程-flipud函数
  8. who whos exist inf
  9. 具有多个生成器和多个判别器的GAN
  10. 模电里的二端口等效模型