建立依赖以和依赖反转的感性认识
看设计方面的技术书的时候,“依赖”这词出现的频率实在是太高了,11项设计原则其实就是规范依赖关系的原则。但是很多初学者对依赖没有感性的认识。本文以一个小工具的实现为例,希望可以帮助这样的朋友建立一个感性认识。 大家在写程序的时候,为了测试代码的效率经常会写下面的代码来测试诸如执行10000次某操作的时间占耗。
Datebegin=new
Date();
for(inti=0;i<100000;i++ ) ... { //被测试的操作: .... } Dateend =new Date(); longduring=end.getTime()- begin.getTime(); System.out.println("时间占耗:"+during+"毫秒"); 如上所示,每次写每次写,代码实在是重复的太多,最近实在受不了了于是写了一个工具类,这次我将通过展示这个简单的工具类表现出什么是依赖。 老规矩,先写测试用例,代码如下
Calculagraphcal
=
new
Calculagraph();
cal.startTime(); for ( int i = 0 ;i < 20000 ;i ++ ) ... { //被测试的操作: .... } cal.endTime(); 执行完毕应该打印出“时间占耗:XXXX毫秒”测试用例完成了则我们的设计也可以大概出来了。编码如下:
public
class
Calculagraph
...
{
publicvoidstartTime()...{ if(begin==null) ...{ begin=newDate(); } } publicvoidendTime()...{ Dateend=newDate(); longduring=end.getTime()-begin.getTime(); begin=null; System.out.println("时间占耗:"+during+"毫秒"); } privateDatebegin; } 到目前为止我们看不到任何依赖的迹象,没错,依赖总是在系统进化的时候才能看清楚。现在系统开始进化了,我们需要它把时间占耗输出到网页中,输出到文件中,输出到某流中以便从服务器返回客户端。可是我们把输出结果固死在代码里了。喏,就是这句:System.out.println("时间占耗:"+during+"毫秒");这个就是依赖,它依赖于System.out类,怎么办?我们需要脱耦,将依赖反转,让他去依赖抽象而不是依赖具体。为此我们做了一个接口,如下所示:
public
interface
TimePrinter
...
{
publicvoidprint(longtime); } 相应的,Calculagraph类也要变化
public
class
Calculagraph
...
{
publicvoidstartTime()...{ if(begin==null) ...{ begin=newDate(); } } publicvoidendTime()...{ Dateend=newDate(); longduring=end.getTime()-begin.getTime(); begin=null; printer.print(during);//注意:变化在这里 } privateTimePrinterprinter;//注意:变化在这里 privateDatebegin; } OK,一个简单的脱耦就完成了。现在我们可以把我们的输出功能放在TimePrinter接口的实现类里面,如果我们再做一个printer的seter方法,那么就变成了一个简单的依赖注入的示例。以上就是关于依赖和脱耦的一个简单教程,希望对初学设计的朋友有帮助。当然,现在我们的测试代码是一定跑不起来了,大家自己动手让他跑起来,作为家庭作业,能力高点的同学可以自己做个读配置文件的IOC类:)。做完这个类我们应该就会明白Spring的IOC框架存在的意义了吧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |