建立依赖以和依赖反转的感性认识

前端之家收集整理的这篇文章主要介绍了建立依赖以和依赖反转的感性认识前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

看设计方面的技术书的时候,“依赖”这词出现的频率实在是太高了,11项设计原则其实就是规范依赖关系的原则。但是很多初学者对依赖没有感性的认识。本文以一个小工具的实现为例,希望可以帮助这样的朋友建立一个感性认识。

大家在写程序的时候,为了测试代码的效率经常会写下面的代码来测试诸如执行10000次某操作的时间占耗。

@H_301_9@ Datebegin=new Date();
for(inti=0;i<100000;i++
)
{
//被测试的操作:

....
}

Dateend
=new Date();
longduring=end.getTime()-
begin.getTime();
System.out.println(
"时间占耗:"+during+"毫秒");

如上所示,每次写每次写,代码实在是重复的太多,最近实在受不了了于是写了一个工具类,这次我将通过展示这个简单的工具类表现出什么是依赖。

老规矩,先写测试用例,代码如下

@H_301_9@ Calculagraphcal = new Calculagraph();
cal.startTime();
for ( int i = 0 ;i < 20000 ;i ++ )
{
//被测试的操作:
....
}

cal.endTime();

执行完毕应该打印出“时间占耗:XXXX毫秒”测试用例完成了则我们的设计也可以大概出来了。编码如下:

@H_301_9@ 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类,怎么办?我们需要脱耦,将依赖反转,让他去依赖抽象而不是依赖具体。为此我们做了一个接口,如下所示:

@H_301_9@ public interface TimePrinter {
publicvoidprint(longtime);
}

相应的,Calculagraph类也要变化

@H_301_9@ 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框架存在的意义了吧。

猜你在找的设计模式相关文章