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



 说一下这篇文章的目的,很重要的一点,是针对上一篇文章中最后提到的
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方法中)

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

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

早期设计

 

改善后的设计

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值