命令模式:
将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求进行排队或记录请求日志...
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的设计模式分析展示了如何将经典设计模式融入实际项目中,以达到简化代码、增强可维护性和提高代码复用性的目的。理解这些模式及其在JUnit中的应用,对于提升Java测试能力及软件开发实践具有重要意义。
本文将对 JUnit 设计模式进行深入分析,探讨 JUnit 中的设计模式应用,了解 JUnit 是如何使用设计模式来实现测试框架的。 一、JUnit 概述 JUnit 是一个优秀的 Java 单元测试框架,由 Erich Gamma 和 Kent Beck ...
《JUnit设计模式分析》 JUnit,作为Java编程语言中最常用的一款单元测试框架,深受开发者喜爱。它简洁易用,能够帮助我们快速编写测试代码,确保软件功能的正确性。本分析将深入探讨JUnit中的设计模式,揭示其内在...
### JUNIT设计模式分析 #### 1. JUnit概述 ##### 1.1 JUnit简介 JUnit是一个开源的Java测试框架,属于XUnit家族的一员。它由Erich Gamma和Kent Beck共同开发完成,旨在简化Java应用程序的单元测试过程。JUnit在...
《Junit设计模式应用》是基于作者业余时间的翻译成果,旨在通过设计模式的角度深入剖析JUnit的内在原理,以此促进读者对单元测试框架理解和运用能力的提升。设计模式是软件工程中的宝贵经验总结,它为解决常见问题...
### JUnit源码及其涉及的设计模式 #### 一、引言 JUnit作为一款广泛应用于Java项目的单元测试框架,其设计理念和实现方式对于软件开发者来说具有很高的学习价值。本文将深入探讨JUnit源码,并重点关注其中使用的...
本文将深入探讨JUnit中应用到的两种主要设计模式:适配器模式和命令模式。 首先,适配器模式在JUnit中的应用主要体现在对接不同接口或类的能力上。适配器模式允许不兼容的类协同工作,通过将旧的或不兼容的接口转换...
7. Junit 架构:Junit 本身是围绕着两个设计模式来设计的:命令模式和集成模式。 8. 命令模式:利用 TestCase 定义一个子类,在这个子类中生成一个被测试的对象,编写代码检测某个方法被调用后对象的状态与预期的...
15. **命令模式**:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。Command模式可能有Command、Invoker和Receiver类。 16. **解释器模式**...
综上所述,JUnit不仅仅是一个单元测试工具,更是设计模式在实践中的典范,展示了模式如何优化代码结构、提高软件质量。对于开发者而言,深入理解JUnit及其背后的设计哲学,不仅能够提升测试技能,还能深化对软件工程...
通过学习上述知识点,你可以逐步掌握Java编程的基础,并理解如何在实际项目中应用设计模式,编写出高效、易维护的Java程序。不断练习和实践是提升编程技能的关键。记得阅读提供的教程,如"Java私塾基础入门教程"和...
- 设计模式:基于命令模式和复合模式,易于扩展和维护。 - 免费开源:降低了使用成本。 然而,JUnit 也有一些不足: - 测试数据与测试代码耦合:不利于数据隔离和复用。 - 无法直接测试GUI组件、JSP或HTML。 - ...
设计模式分为三大类:创建型模式(如单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式)、结构型模式(如代理模式、装饰器模式、适配器模式、桥接模式、组合模式、外观模式、享元模式)和行为型模式(如观察...
例如,在 JUnit 中,使用了命令模式、装饰模式和观察者模式等设计模式。 9. 代码设计的思考过程:通过本文,我们可以看到代码设计的思考过程。我们需要思考为什么要使用某种设计模式,为什么要使用某种实现方式等...
- **定义**:DAO是一种设计模式,用于封装对数据库的访问操作,将业务逻辑与数据访问逻辑分离。 - **作用**:提高代码的可维护性和可扩展性,简化业务逻辑层的代码。 **2. 单元测试挑战** - **依赖问题**:DAO...
本项目"patternsMaze"聚焦于如何通过设计模式来创建一个简单的迷宫生成器,主要使用了Java语言。以下是对该项目中涉及的知识点的详细解释: 1. **设计模式的基本概念**: 设计模式并非具体的代码或库,而是一种在...
3. 行为型设计模式:如观察者模式、命令模式、责任链模式、迭代器模式、访问者模式、备忘录模式、解释器模式等,这些模式关注于对象之间的交互和行为。 二、Android特定设计模式 1. MVP(Model-View-Presenter)...