java设计模式学习3--Command Pattern[原创]
昨天看了下命令模式,有了点心得。
先看一个典故:《后汉书·吕布传》:“诸将谓布曰:‘将军常欲杀刘备,今可假手于术。’”。
命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。
说白了,这种模式叫“假手于人”,借别人的手,来完成自己要做的事。
本来自己可以直接做这件事,硬是在中间插上个第三者,由第三者来统一管理这些事情,好比公司总经理本来可以直接叫单位低层下属做事情的,但是现在就在二者之间插入部门经理,总经理要办事情,只要叫部门经理去就可以了,总经理只要知道是哪个人做什么事就可以了,没必要知道事情是什么时候、怎么做的。
命令模式可以降低系统的耦合度,增强功能模块的复用性,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
上面的话用公司的例子来说,就是如果有副总经理要叫低层下属做事,也可以直接找部门总管,这就是复用性,要增加部门的话,直接增加就可以,不会影响到别的部门的办公。
下面我写个例子说明一下:
//下属
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[原创]相关推荐
- 设计模式学习--观察者模式(Observer Pattern)
设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热! 下午15:28 设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...
- java设计模式学习笔记之装饰模式
java设计模式学习笔记之装饰模式 尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697 这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧& ...
- Java设计模式学习记录-解释器模式
前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...
- Java - 设计模式学习总结
熟练掌握各种设计模式,并能在实际编程开发中灵活运用它们,不仅能使代码更规范,重用性更高,同时也能保证代码的可靠性,提高开发效率.这段时间又系统看了设计模式的相关内容,整理学习总结如下,文中内容如有表达 ...
- Java 设计模式学习推荐
基础知识 设计模式概述 从招式与内功谈起--设计模式概述(一):设计模式从何而来? 从招式与内功谈起--设计模式概述(二):设计模式是什么? 从招式与内功谈起--设计模式概述(三):设计模式有什么用? ...
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
- Java设计模式学习总结(16)——行为型模式之命令模式
命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应 ...
- Java设计模式学习 - 模版方法模式策略模式
个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...
- 【一】Java 设计模式学习记录: 工厂模式
文章目录 一.设计模式的分类 二.工厂模式 2.1 简单工厂模式 2.1.1 解决的问题 2.1.2 简单工厂模式是什么 2.1.3 优缺点 2.2 工厂方法模式 2.2.1 解决的问题 2.2.2工 ...
- 设计模式:命令模式(Command Pattern)
命令模式(Command Pattern): 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是哪个. 我们只需在程序运行时指定具体的请求接受者即可,此时 ...
最新文章
- H.265 HD 和H.265 4K Video Encoder IP Core
- 5G NPN 行业专网 — 解决方案
- HBase Shell常用的命令
- Java 线程池框架核心代码分析
- 基于MQTT协议进行应用开发
- 用python和sympy库解决方程组问题_Python语言 SymPy库数学方程问题——线性方程组篇...
- 一瓶可乐的自动售货机指令“旅程”
- python面试1000题之7-8
- 防盗链IHttpHandler
- 计算机网络与通信之物理层中的数据传输
- 【机器学习】二次规划
- html网页对账单样式,怎样在EXCEL中做工行对账单,样式字体要...
- 制作WIN_XP无人值守光盘
- Windows的Git Bash使用tree命令
- Linux基础知识汇总、有这一篇就够了(2021最新整理)
- QT实现串口调试助手(一)
- ElasticJob‐Lite:更换事件追踪数据源应用启动报错
- 外包一个小程序多少钱(外包小程序开发的价格费用)
- amd cpu排行_目前cpu排行榜(2020cpu性能排名对比)
- python如何实现图像中特定颜色的种类识别及特定颜色的占比代码
热门文章
- bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)
- C语言项目实战之简单的文本编辑器
- 任意进制的转换(C,C++)itoa函数,strtol函数,bitset函数,oct函数,dec函数,hex函数
- sort函数的使用(c++) bool函数使用
- [paper reading] YOLO v1
- python网络爬虫系列教程——python中requests库应用全解
- matlab2c使用c++实现matlab函数系列教程-flipud函数
- who whos exist inf
- 具有多个生成器和多个判别器的GAN
- 模电里的二端口等效模型