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

看设计方面的技术书的时候,“依赖”这词出现的频率实在是太高了,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框架存在的意义了吧。

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...