基本上,DIP的主要思想是:
- 高级模块不应该依赖于低级模块。两者都应该依赖于抽象。
- 抽象不应该依赖于细节。细节应该取决于抽象。
如您所见,它说should而不是must。它并不禁止你做任何事情。
如果您的课程是composite of / aggregate to
其他特定的classes
(不是interfaces / abstract classes
),那很好!您的代码仍将编译和运行,不会显示警告告诉您:“嘿,您违反了 DIP”。所以我认为你的问题的答案是:不,它没有。
假设您的系统由一千个类组成,您可以将 DIP 应用于 2 个类,其中一个依赖于第 3 个特定类(不是interfaces / abstract classes
)。只要你的问题解决了,什么都不重要。因此,请尽量使您的解决方案简短而简单-> 易于理解。相信我,当您回顾您的解决方案 1 个月后,您会发现它很有价值。
DIP 是一种指导方针,它告诉您当您面临一组特定的问题以解决这些问题时该怎么做。这不是一个神奇的指南,它是有代价的:复杂性。您应用 DIP 的次数越多,您的系统就越复杂。所以明智地使用它。为了进一步支持这一点,我建议您看一下这个参考资料(取自Head First: Design Patterns
书中)。访问此链接(它是一个 PDF 文件)并在顶部栏导航到 page 635 / 681
。或者,如果您足够懒惰,请阅读以下引用:
你对模式的看法
初学者到处使用模式。这很好:初学者可以获得大量使用模式的经验和练习。初学者还认为,“我使用的图案越多,设计就越好。” 初学者会知道并非如此,所有设计都应该尽可能简单。复杂性和模式应该只在实际可扩展性需要的地方使用。
随着学习的进展,中级思维开始看到哪里需要模式,哪里不需要。中性思维仍然试图将太多的方形图案放入圆孔中,但也开始看到可以调整图案以适应规范图案不适合的情况。
禅心能够看到它们自然适合的模式。禅心不执着于使用模式;相反,它寻找最能解决问题的简单解决方案。禅心根据对象原则及其权衡来思考。当对一种模式的需求自然出现时,禅心就会应用它,因为它很清楚它可能需要适应。禅心还可以看到与相似模式的关系,并理解相关模式意图差异的微妙之处。禅心也是初学者的心——它不会让所有的模式知识过度影响设计决策。
最后,我会指出一个使用 DIP 的四人组设计模式:策略
示例问题:ACharacter
可以使用 3 种武器:Hand
, Sword
, & Gun
。他(Character
)可以随时更换他当前的武器。
分析:这是一个很典型的问题。棘手的部分是如何在运行时处理武器交换。
带有策略的候选解决方案:(只是一个草图):
![在此处输入图像描述](https://i.stack.imgur.com/8NRw7.jpg)
weapon = new Hand();
weapon.Attack(); // Implementation of Hand class
weapon = new Sword();
weapon.Attack(); // Implementation of Sword class
weapon = new Gun();
weapon.Attack(); // Implementation of Gun class
其他使用 DIP 的设计模式和框架: