命令模式:
将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求进行排队或记录请求日志...
Command模式告诉我们可以为一个操作(方法)生成一个对象并给出它的一个"execute(执行)"方法。
注意:这里都是一个。
命令模式的构成:
1、客户角色 : 创建一个具体命令对象,并确定其接收者
2、命令角色 : 声明一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个接口或抽象类实现
3、具体角色 : 定义一个接收者和行为之间的弱耦合,实现execute方法,负责调用接收者的相应操作
4、请求者角色 : 负责调用命令对象执行请求
5、接收者角色 : 负责具体实施和执行一个请求
通过一个类比来方便我们的记忆:
当我们去饭店吃饭,点菜的时候,点菜就是一个命令,命令并不会自己去完成,而是有一个具体的接收者去完成的,点菜以后具体的实施是由厨师去完成的,那么厨师就是一个接收者,所以命令中要持有一个厨师的引用,而厨师并不依赖任何其他的对象。
代码实现:
命令的接口:
public interface Command {
public void doCommand(); //点菜
}
命令的实现:
public class ConcreteCommand implements Command {
private Receiver receiver; //接收者,在这里是厨师
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
public void doCommand() {
receiver.doAction();
}
}
接收者(厨师):
public class Receiver { //不依赖于其他任何的对象
public void doAction() {
System.out.println("do action");
}
}
请求者(客户端):
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
command.doCommand();
}
}
对应于junit3.8中的代码实现
在junit3.8中定义了Test接口
public interface Test {
/**
* Counts the number of test cases that will be run by this test.
*/
public abstract int countTestCases();
/**
* Runs a test and collects its result in a TestResult instance.
*/
public abstract void run(TestResult result);
}
这里的Test接口就是Command的接口,run方法就是command中的doAction方法
TestCase是Test接口的抽象实现。它增加了一个测试名称属性,因为每一个TestCase在创建时都要有一个名称,如果一个测试失败了,便可识别出是哪个测试失败。
public abstract class TestCase extends Assert implements Test {
/**
* the name of the test case
*/
private String fName;
public void run(TestResult result) {
result.run(this);
}
}
这样测试人员,编写测试用例时,只需继承TestCase,来完成run方法即可,然后JUnit获得测试用例的请求,执行它的run方法,把测试结果记录在TestResult之中,目前可以暂且这样理解。
效果:
下面来考虑经过使用Command模式后给系统的架构带来了那些效果:
1、Command模式将实现请求的一方(TestCase开发)和调用一方(JUnit )进行解藕
2、Command模式使新的TestCase很容易加入,无需改变已有的类,只需继承TestCase类即可,这样方便了测试人员
3、Command模式可以将多个TestCase进行组合成一个复合命令,你将看到TestSuit就是它的复合命令,当然它使用了Composite模式
4、Command模式容易把请求的TestCase组合成请求队列,这样使接收请求的一方(Junit Fromwork),容易决定是否执行请求,一旦发现测试用例失败或者错误可以立刻停止进行报告
5、Command模式可以在需要的情况下,方便实现对请求的Undo和Redo,以及记录Log,这部分目前在JUnit中还没有实现,将来是很容易加入的。
缺点:
由于命令模式只能为一个操作(方法)生成一个对象并给出它的一个"execute(执行)"方法。
所以:10个操作就要生成10个对象,会造成类的膨胀的!!!而且没个类中只能有一个方法,然后由接收者去执行这个方法。
所以在Junit3.8框架中就引入了适配器模式,将在后文中详细阐述!
分享到:
相关推荐
存储库的经验,学习设计模式,创建模型和设计模式代码生成器的面向对象设计,学习创建 JUnit 或 Cucumber 或 FlatSpec 测试,并且您将创建您的 SBT 或 Gradle 构建脚本。 完成此作业对于成功完成本课程的其余部分至...
存储库的经验,学习了许多设计模式,创建了模型和设计模式代码生成器的面向对象设计,学习了创建 JUnit 或 Cucumber 或FlatSpec 测试,并且您创建了 SBT 或 Gradle 构建脚本。 恭喜! 如果您还没有这样做,请在 Git ...
存储库的经验,学习了许多设计模式,创建了模型和设计模式代码生成器的面向对象设计,学习了创建 JUnit 或 Cucumber 或FlatSpec 测试,您创建了 SBT 或 Gradle 构建脚本,并完成了您的第一个 IntelliJ 插件! 恭喜!...
命令模式 解释器模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 ...
这是我的第一个使用Java中的面向对象编程的项目。 描述 该项目是一个自行车赛车模拟器。 首先,允许用户选择比赛参与者的数量,并以此显示控制台,图形界面和第一条帮助消息。 之后,允许用户通过控制台命令或读取...
存储库的经验,学习了许多设计模式,创建了模型和设计模式代码生成器的面向对象设计,学习了创建 JUnit 或 Cucumber 或FlatSpec 测试,您创建了 SBT 或 Gradle 构建脚本,并完成了您的第一个 IntelliJ 插件! 恭喜!...
存储库的经验,学习了许多设计模式,创建了模型和设计模式代码生成器的面向对象设计,学习了创建 JUnit 或 Cucumber 或FlatSpec 测试,您创建了 SBT 或 Gradle 构建脚本,并完成了您的第一个 IntelliJ 插件! 恭喜!...
熟悉常用设计模式、数据结构、多线程、HTTP,TCP/IP协议、UML建模,了解JVM内存管理及调优 熟练使用SpringBoot、SpringMVC,了解SpringCloud,初步研究过Spring、JDK部分底层源码及思想 熟练使用MySQL、Redis、...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...
通过RESTful URL设计查看用户个人资料更新用户个人资料详细信息处理照片上传和存储删除帐户并相应地更新MySQL数据库使用JUnit对提到的功能进行单元测试与代码提交的协作与协调我学到的是Spring框架HibernateORM全栈...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...
2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...
而是为设计模式和相关问题的一些演示提供一个平台,特别是在 Java 语言中,包括“撤消”命令。 如果有人(甚至是我)试图将它变成一个有用的行编辑器,你就会知道 CLI 的粉丝已经在极客圈中重新占据了上风。 或不。 ...
8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/(第 8/24 页)2006-11-02 19:12:13 MySQL 5.1 Reference ...
8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符...
8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符...
8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符...
8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符...
8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1....