Java设计模式系列之命令模式
命令模式(Command)的定义
将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。
命令模式(Command)的适用性
1.抽象出待执行的动作以参数化某对象。
2.在不同的时刻指定、排列和执行请求。
3.支持取消操作。
4.支持修改日志,这样当系统崩溃时,这样修改可以被重做一遍。
5.用构建在原语操作上的高层操作构造一个系统。
命令模式(Command)的应用效果:
1)command模式将调用操作的对象和实现该操作的对象解耦
2)可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
3)增加新的command很容易,无需改变已有的类
命令模式(Command)的参与者
1.Command
声明执行操作的接口。
2.ConcreteCommand
将一个接收者对象绑定于一个动作。
调用接收者相应的操作,以实现Execute。
3.Client
创建一个具体命令对象并设定它的接收者。
4.Invoker
要求该命令执行这个请求。
5.Receiver
知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。
命令模式(Command)的UML类图

具体的代码实现:
第一步:定义Command,声明执行操作的接口
//命令接口
public interface Command { //执行操作
public void excute();
//撤销操作
public void unDo();
}
第二步:定义ConcreteCommand,将一个接收者对象绑定于一个动作。
public class ConcreteCommand implements Command {
// 持有一个接受者Receiver的引用,绑定一个特定的操作
Receiver receiver;
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void excute() {
// 接受者绑定执行动作
receiver.action();
}
@Override
public void unDo() {
// 接受者绑定的撤销动作
receiver.unAction();
}
}
第三步:定义Receiver,知道如何实现与执行一个请求相关的操作
public class Receiver {
public void action() {
System.out.println("执行一个命令");
}
public void unAction() {
System.out.println("撤销一个命令");
}
}
第四步:定义Invoker,要求该命令执行这个请求。
public class Invoker {
// 调用者持有一个命令对象
Command command;
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
// 执行命令
public void excuteCommmand() {
command.excute();
}
// 撤销命令
public void undoCommand() {
command.unDo();
}
}
第五步:定义Clien,我们来测试一下我们的命令模式
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// 创建命令的接受者
Receiver receiver = new Receiver();
// 创建命令对象,并设定它的接受者
Command command = new ConcreteCommand(receiver);
// 创建命令执行者,并将相应的命令作为参数传递给Invoker
Invoker invoker = new Invoker();
invoker.setCommand(command);
// Client端测试一下
invoker.excuteCommmand();
invoker.undoCommand();
}
}
运行结果:
执行一个命令
撤销一个命令
总结:
1、在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作;
2、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用;
3、调用者可以接受命令当作参数,甚至在运行时动态的进行;
4、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态;
5、命令模式将发出请求的对象和执行请求的对象进行解耦;
Java设计模式系列之命令模式的更多相关文章
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- Java设计模式学习记录-命令模式
前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...
- 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到 ...
- java设计模式-----23、命令模式
概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 命令模式(Command Pattern)是一种 ...
- c#设计模式系列:命令模式(Command Pattern)
引言 命令模式,我感觉"命令"就是任务,执行了命令就完成了一个任务.或者说,命令是任务,我们再从这个名字上并不知道命令的发出者和接受者分别是谁,为什么呢?因为我们并不关心他们是谁, ...
- 《JAVA设计模式》之命令模式(Command)
在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...
- C#设计模式系列:命令模式(Command)
1.命令模式简介 1.1>.定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护.命令模式的核心思想是将请求封装为一个对象,将其作为命 ...
随机推荐
- 从输入 URL 到页面加载完的过程中都发生了什么---优化
这篇文章是转载自:安度博客,http://www.itbbu.com/1490.html 在很多地方看到,感觉不错,理清了自己之前的一些思路,特转过来留作记录. 一个HTTP请求的过程 为了简化我们先 ...
- Entity Framework学习 - 2.增删改查
1.增加数据 PirateBayEntities db = new PirateBayEntities(); T_Tests test = new T_Tests(); test.Name = &qu ...
- Android的计量单位px,in,mm,pt,dp,dip,sp
android中dip.dp.px.sp和屏幕密度 1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持 ...
- class ha_innobase: public handler
/** The class defining a handle to an Innodb table */ class ha_innobase: public handler { row_prebui ...
- bzoj3272 3638
好题,这道题可以用线段树来快速模拟费用流寻找最长增广路 这样修改怎么做也很显然了 type node=record s,lx,rx,mx,lp,rp,pb,pe:longint; end; ..*,. ...
- MasterPage的自身Bug还是?
如果不想每个页面都设置css样式,那就在MasterPage设置即可,但是有个问题就是路径并不能识别正确,所以必须让你的页面和MasterPage的页面在平级的位置. 例如MasterPage.mas ...
- Codeforces Round #273 (Div. 2)
A. Initial Bet 题意:给出5个数,判断它们的和是否为5的倍数,注意和为0的情况 #include<iostream> #include<cstdio> #incl ...
- 漫谈 polling 和 Websocket
Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...
- ActivityManager: Warning: Activity not started, its current task has been brought to the front 的的问题
运行android程序的时候提示:ActivityManager: Warning: Activity not started, its current task has been brought t ...
- Android之 环境搭建
一. 使用ADT Bundle多合一下载包 下载地址:链接:http://pan.baidu.com/s/1gepNRjX 密码: ozdi 说 明:多合一下载包,里面包含了:sdk + ...