您的位置:首页 > 移动开发 > Android开发

设计模式在Java/Android中的应用

2015-07-22 22:09 393 查看
原文链接 : http://www.zhihu.com/question/29575295/answer/44854126

Android的设计模式实际上也就是Java的设计模式,题主想看设计模式在实际工程中的应用,那建议题主去看 JUnit 的源码或者分析。

JUnit是Java中著名的单元测试框架,其作者是两位世界级的软件工程大师:GOF四人帮之一的Erich
Gamma和敏捷开发的开创者之一Kent
Beck。JUnit很好的体现了两位的程序设计思想,其中也非常灵活的运用了多种设计模式,如果深入学习一定会能使题主灵活的掌握和使用各类设计模式,设计模式就23种,关键是看你怎么使用。

以下是对于命令模式在JUnit中的使用分析:

3.2 Command(命令)模式

3.2.1 问题

首先要明白,JUnit是一个测试framework,测试人员只需开发测试用例。然后把这些测试用例组成请求(有时可能是一个或者多个),发送到JUnit FrameWork,然后由JUnit执行测试,最后报告详细测试结果。其中包括执行的时间,错误方法,错误位置等。这样测试用例的开发人员就不需知道JUnit内部的细节,只要符合它定义的请求格式即可。从JUnit的角度考虑,它并不需要知道请求TestCase的操作信息,仅把它当作一种命令来执行,然后把执行测试结果发给测试人员。这样就使JUnit 框架和TestCase的开发人员独立开来,使得请求的一方不必知道接收请求一方的详细信息,更不必知道是怎样被接收,以及怎样被执行的,实现系统的松耦合。

3.2.2 模式的选择

Command(命令)模式则能够比较好地满足需求(请参见Gamma, E., et al. Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, Reading, MA, 1995)。摘引其意图(intent),将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求进行排队或记录请求日志...Command告诉我们可以为一个操作生成一个对象并给出它的一个execute(执行)方法。

3.2.3 实现

为了实现Command模式,首先定义了一个接口Test,其中Run便是Command的Execute方法。然后又使用Default Adapter模式为这个接口提供了缺省实现TestCase抽象类,这样我们开发人员就可以从这个缺省实现进行集成,而不必从Test接口进行实现。



我们首先来分析Test接口。它存在一个是countTestCases方法,它来统计这次测试有多少个TestCase,另外一个方法就是我们的Command模式的Excecute方法,这里命名为run。还有一个参数TestResult,它来统计测试结果

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);
}


TestCase是该接口的抽象实现,它增加了一个测试名称,因为每一个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之中,目前可以暂且这样理解。

3.2.4 效果

下面来考虑经过使用Command模式后给系统的架构带来了那些效果:

Command模式将实现请求的一方(TestCase开发)和调用一方(JUnit Fromwork)进行解藕

Command模式使新的TestCase很容易的加入,无需改变已有的类,只需继承TestCase类即可,这样方便了测试人员

Command模式可以将多个TestCase进行组合成一个复合命令,实际你将看到TestSuit就是它的复合命令,当然它使用了Composite模式

Command模式容易把请求的TestCase组合成请求队列,这样使接收请求的一方(Junit Fromwork),容易的决定是否执行请求,或者一旦发现测试用例失败或者错误可以立刻停止进行报告

Command模式可以在需要的情况下,方便的实现对请求的Undo和Redo,以及记录Log,这部分目前在JUnit中还没有实现,将来是很容易加入的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: