`
lemonhandsome
  • 浏览: 13694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多



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

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

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

早期设计

 

改善后的设计

 

  • 大小: 18.1 KB
  • 大小: 26.2 KB
分享到:
评论

相关推荐

    浅谈生成器在设计中的应用

    - **依赖倒置原则**:依赖于抽象,而不是具体实现。 - **接口隔离原则**:接口应尽可能小且专用,避免庞大而通用的接口。 - **迪米特法则**:降低类之间的耦合度,只与直接朋友通信。 5. **生成器模式详解**: ...

    Java 设计模式

    - **从招式与内功谈起**:这部分内容旨在通过比喻的方式,帮助读者理解设计模式的本质及其在实际开发中的应用价值。招式指的是具体的编码技巧,而内功则是对设计模式背后的原理的理解。 #### 三、面向对象设计原则 ...

    浅谈软件工程思想的问题

    常见的设计原则包括单一职责原则、开放封闭原则、依赖倒置原则等,同时,设计模式如工厂模式、观察者模式等也是设计阶段的重要工具。 3. 编码实施:编写代码时,应遵循一定的编程规范,保证代码的清晰性和可读性。...

    浅谈java中OO的概念和设计原则(必看)

    下面我们将从OO的设计基础、面向对象设计模式、设计目标、设计原则五大方面来浅谈Java中OO的概念和设计原则。 一、OO的设计基础 OO是基于对象概念,以对象为中心,以类和继承为构造机制,充分利用接口和多态提供...

    你必须知道的.net

    依赖注入(Dependency Injection, DI)是一种设计模式,用于实现依赖倒置原则。通过将对象所依赖的其他对象在其创建时通过构造函数、属性或者方法传递进去,而不是在内部创建这些依赖,可以显著降低类之间的耦合度,...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

Global site tag (gtag.js) - Google Analytics