http://www.oodesign.com/open-close-principle.html
持有OCP的代码也满足DIP.任何人都可以给我一个持有OCP但不是DIP的代码示例吗?
我发现依赖注入和开放/关闭的解释也令人困惑.它不一定是这样.让我们来看看你引用的文章: http://www.oodesign.com/open-close-principle.html在他们的示例中,有一个GraphicsEditor类和一个形状类的层次结构.在他们展示的第一个类图中,GraphicsEditor中有一堆方法用于绘制每种形状类:drawShape;画圆; DrawRectangle的.
如果要添加平行四边形类会发生什么?首先创建新类Parallelogram,然后修改GraphicsEditor类以添加一个名为drawParallelogram的新方法.
这是文章所指的“不良”:添加一个新形状意味着您必须更改现有代码.您添加了一个新的Shape(平行四边形)子类,并向GraphicsEditor(drawParallelogram)添加了一个新方法.
这可能看起来不是什么大问题,但它不会扩展.想象一下,一个由20名开发人员组成的团队同时处理该软件.首先,每个添加新形状的开发人员都必须记住做两件事:更新现有代码并创建新代码.加入该项目的每个新开发人员都可能很难学到这一点.其次,如果每个人每天都在添加新形状,则意味着每个人都在尝试编辑GraphicsEditor类.同时.这很头疼.问我怎么知道. :-)(当修改现有代码时,也有可能引入错误.)
如果您可以在不触及GraphicsEditor类中的任何代码的情况下向系统添加新Shape,那将是理想的选择.这就是文章想要展示的内容.
请看文章中的第二个类图.现在每个形状都实现了自己的绘制方法. GraphicsEditor只需要知道有一些超类“Shape”,并且它的所有子类都实现了“draw”方法. GraphicsEditor不再关心有多少子类或它们的名称.开发人员可以自由地实现新的形状,而无需修改GraphicsEditor类. GraphicsEditor类现在“关闭”.通过这种方式,系统“可以扩展” – 不需要更改现有代码来创建新形状.问题解决了.
理解所有这些的更简单方法是学习访客设计模式.我不喜欢维基百科对这种模式的解释,因此我将指向另一个地方:http://sourcemaking.com/design_patterns/visitor.我认为理解访客模式会使所有其他术语和概念落实到位.