说一下这篇文章的目的,很重要的一点,是针对上一篇文章中最后提到的
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方法中)
以上两点说明,依赖并没有从这个业务中解除,但单从处理模块上可以看出,达到了单一职责的目的,一旦有如上所说的业务变动,不用再去修改这部分代码
前后两部分的类图关系如下:
早期设计
改善后的设计
相关推荐
深入浅出设计模式这本资料,针对中文读者详细介绍了这一主题,旨在帮助开发者更好地理解和应用这些模式。资料中可能涵盖了面向对象设计的基础,以及23种经典的GOF(GoF,Gang of Four)设计模式。 首先,我们来谈谈...
### OO设计原则 -- OO设计的 DIP依赖倒置原则 #### 概述 在软件工程领域,特别是面向对象设计中,依赖倒置原则(Dependency Inversion Principle, DIP)是六大设计原则之一,由著名软件架构师Robert C. Martin提出...
例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...
依赖倒置、控制反转和依赖注入是面向对象编程中...在实践中,我们可以结合具体的情况选择合适的策略,比如使用依赖注入框架来自动管理依赖关系,或者通过设计良好的接口来实现依赖倒置,以实现软件的高质量和高效率。
2. **使用依赖注入**:依赖注入是一种常用的设计模式,它允许在运行时动态地注入对象所需的依赖关系。通过依赖注入,可以减少类之间的直接耦合,使得代码更易于测试和维护。 3. **避免紧耦合**:紧耦合是指一个模块...
- 在Spring框架中,依赖注入(Dependency Injection,DI)机制就是依赖倒置原则的一个典型应用,它允许开发者在运行时动态地将依赖关系注入到对象中,降低了组件间的耦合。 通过遵循依赖倒置原则,开发者能够构建...
- 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,对象看起来...
此外,书中还可能涉及设计原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)和依赖倒置原则(DIP),这些都是面向对象设计的基础,对于写出高质量的代码至关重要。这些原则与设计模式...
这份名为“设计模式PPT——25种设计模式详解”的资料,显然是一个深入探讨设计模式的教程,它通过PDF格式对25种主要的设计模式进行了详尽的阐述。 首先,我们要理解设计模式的基本概念。设计模式不是代码,而是一种...
除了介绍各个模式,王翔还会讨论设计原则,如单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open-Closed Principle, OCP)和依赖倒置原则(Dependency Inversion Principle, DIP)。这些原则是...
通过该倒置,引入C层来规范,A和B 可以同时 来开发,不必相互等待(依赖)这里的倒置,既有模块依赖上的倒置,更有在解决问题时,思考和规划上的倒置,即要先进行良好的顶层规划设计,约定好接口规范,而具体的逻辑...
设计模式公司出品的《JAVA设计模式》书籍,详细介绍了多种设计模式,适合不同水平的程序员学习和使用。 首先,我们来了解什么是设计模式。设计模式是软件开发过程中遇到的某一类问题的典型解决方案。它们通常被分为...
同时,设计模式也有助于提升系统的可扩展性和可维护性,因为它们遵循了良好的设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。 在Java开发中,熟练掌握和运用设计模式不仅可以提升...
此外,书中可能还会涉及面向对象设计原则,如单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)和接口隔离原则(ISP),这些都是设计模式背后的重要理论基础。 总的来说,《设计模式--基于C#...
- 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - 迭代子模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的...
《深入浅出设计模式》是一本深受欢迎的设计模式学习书籍,旨在帮助读者理解并熟练运用设计模式。在本文中,我们将重点关注策略模式以及它与三个核心设计原则的关系。策略模式是一种行为设计模式,它使你能在运行时...
虽然具体内容未给出,但通常这样的文章会通过代码示例来解释如何在实际编程中应用该原则,可能包括创建抽象接口,将高层模块与低层模块通过接口连接,以及如何在具体场景下改变依赖关系。 在压缩包`...
Java依赖倒置原则是软件设计中的一个重要概念,它源自于设计模式之父Misko Hevery提出的"Dependency Inversion Principle",简称为DIP。这个原则是面向对象设计的五大原则(SOLID)之一,旨在提高代码的可复用性和可...
设计模式6大原则:依赖倒置原则
5.3.1 依赖倒置原则和依赖注入模式 5.3.2 接口分离原则 5.3.3 里氏替换原则 5.4 小结 第6章 服务层 6.1 服务层介绍 6.1.1 SOA 6.1.2 SOA的4项信条 6.1.3 Facade设计模式 6.2 应用Messaging模式 6.2.1 ...