第九章 接口
不可否认,我们开始了难啃的骨头的一部分,对于接口,其实也就是那些东西而已,没什么问题,弄一下就熟了
好,废话不多说,开始吧
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法
其实这种机制在编程语言中不通用,c++只是间接支持,不过在java中,他们是非常重要的思想
.抽象类与抽象方法
抽象类其实它是普通类与接口之间一种中庸之道,在使用时,可能一开始你就想用接口,但是事实是,抽象类很重要且必须.创建抽象类希望可以通过这个通用的接口操纵一系列的类.
包含抽象方法的类叫做抽象类,如果一个类包含一个或者多个抽象方法,该类必须被限定为抽象的abstract(否则,编译器会报错);抽象类的所有方法不一定都是抽象的
1.若要创建一个抽象类的对象,必须实现其里面所有的抽象方法,抽象方法默认且只能是public
2.若继承了抽象类,必须重写其所有的抽象方法,否则报错,除非你定义子类也为抽象类
抽象类对重构也是很有好处的,在我学习android的过程中,有许多框架里面的类就是抽象类
.接口
interface产生一个完全抽象的类,它根本就没有提供任何的实现,至少提供了形式,“一个接口表示:所有实现了该特定接口的类看起来都像这样” ,很多时候它弥补了java单继承的不足
接口可以包含域,但是这些域都是隐式的static和final,这些代表着不能改变其值
当实现该接口时,必须重写其所有方法,注意接口之间是可以继承的,但是不可以实现,接口的继承也用extented,而且不需要重写方法也可以
接口所有的方法或者变量什么的,默认是public,对于接口有两种访问权限,public和包权限,不写就是包权限
.完全解耦
这里介绍了一个设计模式,。还真多啊,我这里大概讲一下
创建一个能够根据所以传递的参数对象的不同而具有不同行为的方法,被称为策略设计模式,,这类方法包含所要执行的算法中固定不变的部分,而策略包含变化的步伐,策略就是传进去的参数对象,这个模式和状态模式比较像,在我的模式文章里面详细介绍
例子(这个不是策略模式的例子,是说完全解耦的)
第一种情况,我本来有一个基类,叫做汽车基类,方法有开空调,开灯什么的,然后有许多小子类继承汽车基类
那么就有奔驰啊,宝马什么的,然后测试类(也就是有main方法的那个类),是人类,有开这个方法
接受的参数是汽车类(子类会向上转型)
那么这个人就可以开车咯,
本来这一切都很好的,但是这有时候,突然有飞机要这个人开,但是这个人他的开方法只能接受汽车啊
那怎么办,哎,那就开不了飞机了,这就是耦合度很高
所以解决办法就是因为飞机基类和汽车基类有相同的接口(也就是相同的方法),所以我们只需要定义一个接口,然后把这些方法放进去,然后子类实现这个接口,什么奔驰,波音,直升机什么的,然后在这个人的开方法传入的是接口
那么自然他什么都能开了,因为其他子类实现了这个接口,就能向上转型啦
第二种情况,针对第一种情况,我们是基于我们有权利修改汽车基类的代码,但是假如我们没有权利怎么办,这种情况经常发生,我们只是用别人的接口,。如果别人写的很烂,那怎么办,这时候就可以使用适配器模式,草,有一个模式,在适配器模式中将接受你拥有的接口,并产生你需要的接口...还是那句话,具体请看我的模式文章
.多重继承
可以使用接口达到多重继承这种效果,使用接口的好处在于灵活的向上转型(我还记得之前说过判别是非用继承,就问问自己是否需要向上转型),看来向上转型的确是非常重要的一个point,另外一个好处就在于,对这个类的使用者不必一点要基于这个类进行开发,降低了依赖性
书上179页的那个例子挺特别,继承抽象类实现了接口的fight方法.
.组合接口时的名字冲突
不要在不同的接口与抽象类中使用相同的方法签名,或者相同的方法名,否则你会被他们的覆盖,实现,重载搞死的
.适配接口
就是使用策略模式和适配器模式进行接口的适配,很强大,具体可以看看我的模式篇
注:在java5以前,定义常量很多时候都是在接口域里面定义的,因为是static和final,当然啦,现在有了enum
接口的域的值存储在该接口的静态存储区域内,,接口还可以嵌套在接口和类中,作用暂时没发现
.接口与工厂
这是关于创建框架的,
是这样的,以游戏系统为例子
有两个接口,一个是游戏接口,一个是工厂接口
国际象棋类实现了游戏接口,跳起实现了游戏接口,国际象棋工厂实现了工厂接口(核心方法是创建国际象棋对象)
跳起工厂实现了工厂接口(核心方法是创建了跳起对象),然后在测试类里面调用工厂,传入不同的工厂类,就能构造不同的工厂,这个就是工厂模式(不是简单工厂模式哦),好处就是在添加一种新产品时,不用重复写他的逻辑,更抽象,耦合度更低了,下一章会介绍更加优雅的工厂模式
总结:接口很好用,也很强大,作用无非也就是高内聚,低耦合原则,但是我们不要盲目去使用接口,更多时候我们的原则应该是优先选择类
注:java之测试junit http://wenku.baidu.com/view/a48a8168a98271fe910ef984.html?from=rec&pos=1&weight=19&lastweight=15&count=5
10款常用Java测试工具
1. 美国Segue公司的Silk系列产品
Segue公司一直专注于软件质量优化领域。在Segue的产品套件中,拥有业内最强劲且最容易使用的、用于企业应用测试、调优和监测的自动化工具,能够帮助用户保障应用在其生命周期内的可靠性和性能。
(1) SilkPerformer——企业级性能测试工具
企业级自动化测试工具能够支持多种系统,如Java、.Net、Wireless、COM、CORBA、Oracle、Citrix、MetaFrame、客户机/服务器、以及各种ERP/CRM应用
多项专利技术精确模拟各种复杂的企业环境
可视化脚本记录功能及自定义工具简化了测试创建工作
SilkPerformer的Java/.NET浏览器以及JUnit/NUnit测试输入功能简化了对并发访问情况下远程应用组件的早期负载测试工作
方便易用,工作流向导会逐步引导用户完成整个测试流程
(2) SilkTest International——业内唯一的Unicode功能测试工具
SilkBean 充分利用 Java 语言的“编写一次,随处使用”的优点,让用户不必修改现有的脚本而能够在多种基于 Unix 的系统上运行
能够识别多种开发平台,如Java、JavaScript、HTML、ActiveX、Visual Basic 和C/C++等
一套脚本可供所有支持的语言使用
内置的错误恢复系统不仅具有自定义功能,可进行无人看守的自动测试
赛格瑞(Segue)公司是全球范围内专注于软件质量优化解决方案的领导者。2005年,赛格瑞(Segue)公司在中国设立了专门的销售服务公司,因此,赛格瑞(Segue)公司的软件测试产品在中国有了更好的技术支持。
参考网站:http://www.segue.com.cn/
推荐指数:★★★★★
2. MaxQ
MaxQ是一个免费的功能测试工具。它包括一个HTTP代理工具,可以录制测试脚本,并提供回放测试过程的命令行工具。测试结果的统计图表类似于一些较昂贵的商用测试工具。MaxQ希望能够提供一些关键的功能,比如HTTP测试录制回放功能,并支持脚本。
参考网站:http://maxq.tigris.org/
推荐指数:★★★☆☆
3. Httpunit
HttpUnit是一个开源的测试工具,是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。
HttpUnit提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个模拟Servlet容器,让测试者不需要发布Servlet,就可以对Servlet的内部代码进行测试。本文中作者将详细的介绍如何使用HttpUnit提供的类完成集成测试。
参考网站:http://www.httpunit.org/
推荐指数:★★★☆☆
4. Junit
是通用的测试 java 程序的测试框架JUnit可以对Java代码进行白盒测试。通过JUnitk可以用mock objects进行隔离测试;用Cactus进行容器内测试;用Ant和Maven进行自动构建;在Eclipse内进行测试;对Java应用程序、Filter、Servlet、EJB、JSP、数据库应用程序、Taglib等进行单元测试。
参考网站:http://www.junit.org/
推荐指数:★★★★★
5. Jtest
Jtest是Parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。Jtest先分析每个java类,然后自动生成junit测试用例并执行用例,从而实现代码的最大覆盖,并将代码运行时未处理的异常暴露出来;另外,它还可以检查以DbC(Design by Contract)规范开发的代码的正确性。用户还可以通过扩展测试用例的自动生成器来添加更多的junit用例。Jtest还能按照现有的超过350个编码标准来检查并自动纠正大多数常见的编码规则上的偏差,用户可自定义这些标准,通过简单的几个点击,就能预防类似于未处理异常、函数错误、内存泄漏、性能问题、安全隐患这样的代码问题。
JTest最大的优势在于静态代码分析,至于自动生成测试代码,当然生成测试代码框架也是不错的,但要做好单元测试用户还要做大量的工作。
参考网站:http://www.parasoft.com/jsp/aep/aep.jsp
推荐指数:★★★★☆
6. Hansel
Hansel 是一个测试覆盖率的工具——与用于单元测试的 JUnit framework 相集成,很容易检查单元测试套件的覆盖情况。
参考网站:http://hansel.sourceforge.net/
推荐指数:★★☆☆☆
7. Cactus
Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,HttpServletResponse,HttpSession等针对外部可测试组件运行时,需要把JUnit测试运行为发送HTTP请求给组件的客户端进程。为了在服务器容器内部运行JUnit测试,可以用Cactus框架,它是一个免费的开源框架,是Apache Jakarta项目的一部分。Cactus 包含了关于JUnit客户端如何连接到服务器,然后使测试运行的详细信息。
参考网站:http://jakarta.apache.org/cactus/
推荐指数:★★★★☆
8. JFCUnit
JFCUnit使得你能够为Java偏移应用程序编写测试例子。它为从用代码打开的窗口上获得句柄提供了支持;为在一个部件层次定位部件提供支持;为在部件中发起事件(例如按一个按钮)以及以线程安全方式处理部件测试提供支持。
参考网站:http://jfcunit.sourceforge.net/
推荐指数:★★★☆☆
9. StrutsTestCase
StrutsTestCase(STC)框架是一个开源框架,用来测试基于 Struts 的 Web 应用程序。这个框架允许您在以下方面进行测试:
在 ActionForm 类中的验证逻辑(validate() 方法)
在 Action 类中的业务逻辑(execute() 方法)
动作转发(Action Forwards)。
转发 JSP
STC 支持两种测试类型:
Mock 方法 —— 在这种方法中,通过模拟容器提供的对象(HttpServletRequest、 HttpServletResponse 和 ServletContext),STC 不用把应用程序部署在应用服务器中,就可以对其进行测试。
Cactus 方法 —— 这种方法用于集成测试阶段,在这种方法中,应用程序要部署在容器中,所以可以像运行其他 JUnit 测试用例那样运行测试用例。
参考网站:http:// strutstestcase.sourceforge.net/
推荐指数:★★★★☆
10. TestNG
TestNG是根据JUnit 和 NUnit思想而构建的一个测试框架,但是TestNG增加了许多新的功能使得它变得更加强大与容易使用比如:
支持JSR 175注释(JDK 1.4利用JavaDoc注释同样也支持)
灵活的Test配置
支持默认的runtime和logging JDK功能
强大的执行模型(不再TestSuite)
支持独立的测试方法
参考网站:http://testng.org/
推荐指数:★★★★☆
java美女9