技术标签: java 命令模式 设计模式 command 大话设计模式 object
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。主要解决在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
大话设计模式中程杰老师给出的定义是,命令模式:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
通过调用者调用接受者执行命令来实现整个流程,顺序:调用者→接受者→命令;
关键要定义三个角色:
1、invoker 使用命令对象的入口
2、Command命令对象
3、received 真正的命令执行对象
package com.command;
/**
* 用来声明执行操作的接口
* @author LMB
*
*/
public abstract class Command {
protected Receiver receiver;
//当发布一个命令的时候需要知道该请求命令的接收者
public Command(Receiver receiver){
this.receiver = receiver;
}
public abstract void execute();
}
package com.command;
public class ConcreteCommand extends Command {
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action();//让命令接收者去执行请求
}
}
package com.command;
/**
* 要求命令执行相应请求
* @author LMB
*
*/
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command = command;
}
public void executeCommand(){
command.execute();
}
}
package com.command;
/**
* 知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者
* @author LMB
*
*/
public class Receiver {
public void action(){
System.out.println("执行请求");
}
}
package com.command;
/**
* 创建一个具体命令对象并设定它的接收者
* @author LMB
*
*/
public class CommandPatternDemo {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommand();
}
一个很适合的例子就是客人去饭馆吃饭,将要点的菜告诉服务员,服务员根据库存情况告知客人是否接受该预定,并将预定记录成订单,然后将订单告知后厨的师傅去具体执行做饭操作。如下类图所示:
命令模式的优点:
1、能比较容易的设计一个命令队列(客人的);
2、在需要的情况下,可以比较容易的将命令记入日志(服务员手中记录订单详情的本子);
3、允许接收请求的一方决定是否要否决请求(客人要点某个菜时,服务员可根据该菜是否有来决定接受或者拒绝客人的预定);
4、可以容易的实现对请求的撤销和重做;
5、由于加进新的具体命令类不影响其它的类,因此增加新的具体命令类很容易(增加菜系);
6、命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开(客人不知道菜是怎么做出来的,只有厨师知道);
缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。
使用场景:
认为是命令的地方都可以使用命令模式,比如: 1、GUI 中每一个按钮都是一条命令。 2、模拟 CMD。3、系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式。
应用实例:
struts 1 中的 action 核心控制器 ActionServlet 只有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的 Command。
文章浏览阅读2.6k次。转载于开源中国在Objective-C的ARC模式中,id obj1 = [[NSObject alloc] init]; 这里虽然没有显示的声明为__strong,但是Objective-C默认声明的一个对象就为__strong,即: id obj1 = [[NSObject alloc] init]; 和 id __strong obj1 = [[NSObject alloc] init_ios __strong
文章浏览阅读2.1k次。只要安装libGL即可:sudo apt-get install libqt4-devsudo apt update再重新编译就ok啦 _:-1: error: /usr/local/qt-5.9/lib/libqt5core.so: undefined reference to `uca
文章浏览阅读2.7k次,点赞4次,收藏22次。1.在线版本的NN-SVG_深度学习神经网络图怎么画
文章浏览阅读771次。1、编写布局文件时,遇到这样的警告,“[I18N] Hardcoded string "昵称:", should use @string resource” 原来的代码:
文章浏览阅读252次。众所周知,windows ce是一个实时操作,因此提供了不少的优先级给用户.优先级最高为0级,也就是说使用0优先级的程序, 可以挂起整个系统, 来运行你的程序对于实时性比较的领域, 我们作为程序员的 应该清楚的知道你的程序模块运行的时间 是非常必要的. 当然这个模块运行的时间也不是完全的稳定的, 几次运行的时间相差几十毫秒是很正常的. 因此我们只要知道大概的时间就可以了.当然, 大家..._large_integer计算时间
文章浏览阅读1.9k次。 使用ssh远程登陆 IDC机房服务器,发现老是出现如下告警信息:-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory-bash: warning: setlocale: LC_COLLATE: cannot change locale (en_U..._bash: warning: setlocale: lc_ctype: cannot change locale (en_us.utf-8): no s
文章浏览阅读290次。编写SQL语句时难免会遇到各种条件判断,例如统计:count(case when then end)今天,我们要说的是if判断,eg:SELECT IF(c19='1','已评价','未评价')c19 FROM A05;关于伪列,广为人知的是oracle有伪列rownum,因为一些需求需要用mysql实现类似Oracle的伪列,方法方式如下:SELECT rowid, i01..._mysql 如何使用if else 生成伪列
文章浏览阅读1.7k次,点赞5次,收藏20次。一、函数调用捆绑把函数体与函数调用相联系称为捆绑。当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑。C编译只有一种函数调用方式,就是早捆绑。早捆绑引起的问题:因为编译器在只有对象的地址时它并不知道要调用的正确函数。根据对象的类型,捆绑发生在运行时,这种捆绑方式称为晚捆绑,又称动态捆绑。二、虚函数对于特定的函数,为了引起晚捆绑,C++要求在基类中声明这个函数时使用virtual关键字,这样的函数称为虚函数。晚捆绑只对virtual函数起作用,而且只在使用含有virtual函._c++虚函数内存分布
文章浏览阅读709次。加hann窗全相位比值校正法和加hann窗fft比值校正法校正方法类同,只须将二个振幅比改为振幅开方比即可。这里加hann窗是关键,过去测试时,直接调用Matlab中的hann(N)窗,频率和振幅校正效果差,见表5加hann窗全相位比值校正法测试结果。表4为加n-hann窗全相位比值校正法,其频率校正精度,相位校正精度和振幅校正精度都很高,甚至可以和表1加n-hann卷积窗apfft/apfft校..._比值校正法频谱校正matlab
文章浏览阅读334次。package zhoushi;import javax.swing.*;//调用库import java.awt.*;import java.awt.event.*;public class jh extends JFrame implements ActionListener{//创建类jh继承JFrame,实现接口ActionListener JPanel log;//定义变量_建网站登录页面
文章浏览阅读1k次。1:虚拟机安装先看怎么用VMware安装一个虚拟机,全部放图,一步步来。主要还是以防以后我自己忘记怎么搞了,老了,记性不好了。VMware就在网上随便下载一个了,镜像我会在下面放上我的或者大家也可以自己去网上下一个。第一步:新建虚拟机第二步:选择类型第三步:选择映像文件,一般都会检测到,检测不到就只能自己打开浏览去找吧!第四步:给虚拟机命名,可以更改虚拟机安装位置。反正我是不会装在系统盘的,这辈子都不会的o(´^`)o第五步:默认选择是虚拟磁盘拆分成多个文件,但._shell确认虚拟机光盘连接
文章浏览阅读3.6k次,点赞9次,收藏36次。分类任务常用准确率、精确率、召回率、F1_scores、ROC曲线等指标来评价模型的优劣,当然这些基础指标也可以用来评价分割模型或检测模型,它们基本上是可以通用的。混淆矩阵是对分类问题预测结果的总结,也是衡量分类型模型准确度中最基本,最直观,计算最简单的方法。混淆矩阵中含有4个分类问题的基础指标,如下表所示。........._平均交并比