首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

浅谈设计形式-改变依赖关系,依赖倒置

2013-09-26 
浅谈设计模式----改变依赖关系,依赖倒置?说一下这篇文章的目的,很重要的一点,是针对上一篇文章中最后提到

浅谈设计模式----改变依赖关系,依赖倒置



?说一下这篇文章的目的,很重要的一点,是针对上一篇文章中最后提到的
1、消除不恰当的依赖
2、通过其它方式依赖,可参考倚赖倒置原则

那我们就从如何通过其它依赖的方法,解决类的依赖关系(需要强调的是,要想完全消除依赖是不可能的,除非这两个模块根本没关系)

需要强调的另一个问题是,这种方式往往是通过set方法或者参数达到目的的

案例:

?我们有一个需求,在处理外汇数据的时候,要从银行接收大量的数据,接收到后,要经过好多处理,比如过滤,计算交叉盘。最后发送给交易系统,我们看一下主要类的代码,如下

Test.java,程序的入口类

public class Test {
?private TextBySocket adaptor;

?public void init() {
??adaptor = new TextBySocket();
??StepOne stepOne = new StepOne();
??StepTwo stepTwo = new StepTwo();
??PushService pushService = new PushService();

?

??adaptor.setStepOne(stepOne);
??stepOne.setStepTwo(stepTwo);
??stepTwo.setPushService(pushService);
?}
}

StepOne.java某一个处理步骤类

public class StepOne implements IQuoteProcessor {

private StepTwo stepTwo;//不好的依赖,依赖了具体

public void processQuote(String quote){

quote=quote+"-->StepOne | ";

stepTwo.processQuote(quote);
}

public void setStepTwo(StepTwo stepTwo) {
this.stepTwo = stepTwo;
}
}

StepTwo与之类似的写法

如果需求稳定,这么做也无可厚非,但实际情况却是,有可能这两个模块的顺序需要改变(依赖关系改变),或者要在两者之间增加第三种处理模块(增加并改变依赖关系),这时这个代码就有问题了

我们看怎样通过改变依赖关系来改善程序的

public class Test {
?private TextBySocket adaptor;

?public void init() {
??adaptor = new TextBySocket();
??IQuoteProcessor stepOne = new StepOne();
??IQuoteProcessor stepTwo = new StepTwo();
??IQuoteProcessor stepThree = new StepThree();
??IQuoteProcessor pushService = new PushService();

??adaptor.setProcessor(stepOne);
??stepOne.setProcessor(stepTwo);//依赖关系由这里设置,避免在模块中再依赖
??stepTwo.setProcessor(stepThree);
??stepThree.setProcessor(pushService);
?}
}

StepOne.java

public class StepOne implements IQuoteProcessor {

private IQuoteProcessor stepNext;//依赖了抽象

public void processQuote(String quote){

quote=quote+"-->StepOne | ";

stepNext.processQuote(quote);
}

public void setStepTwo(IQuoteProcessor stepNext) {
this.stepNext= stepNext;
}
?这里主要说明的是,前后的变化主要体现在

1、在某一个处理模块中,不具体依赖某个模块,而只依赖接口IQuoteProcessor

2、具体的依赖关系只放到了调用的地方(组织业务的Test的init方法中)

以上两点说明,依赖并没有从这个业务中解除,但单从处理模块上可以看出,达到了单一职责的目的,一旦有如上所说的业务变动,不用再去修改这部分代码

前后两部分的类图关系如下:

早期设计

浅谈设计形式-改变依赖关系,依赖倒置

?

改善后的设计
浅谈设计形式-改变依赖关系,依赖倒置
?

热点排行