代码复用是减少开发成本时最常用的方式之一。其意图非常明显:与其反复从头开发,不如在新对象中重用已有代码。
变化是程序员生命中唯一不变的事情。 因此在设计程序架构时,所有有经验的开发者会尽量选择支持未来任何可能变更的方式。
找到程序中的变化内容并将其与不变的内容区分开,该原则的主要目的是将变更造成的影响最小化。
面向接口进行开发,而不是面向实现;依赖于抽象类型,而不是具体类。
如果无需修改已有代码就能轻松对类进行扩展,那就可以说这样的设计是灵活的。
让我们再来看一个关于猫的例子,看看这个说法是否正确:一只可以吃任何食物的猫(Cat)要比只吃香肠的猫更加灵活。无论如何你都可给第一只猫喂香肠,因为香肠是“任何食物”的一个子集;当然,你也可以喂这只猫任何食物。
从下图可以看出,右侧(面向接口开发)的代码比左侧(面向实现开发)的代码更加灵活,但也更加复杂。
继承可能是类之间最明显、最简便的代码复用方式。如果你有两个代码相同的类, 就可以为它们创建一个通用的基类,然后将相似的代码移动到其中。
组合是代替继承的一种方法。继承代表类之间的“是”关系(汽车是交通工具),而组合则代表“有”关系(汽车有一个引擎)。
必须一提的是,这个原则也能应用于聚合(一种更松弛的组合变体,一个对象可引用另一个对象,但并不管理其生命周期)。例如:一辆汽车上有司机,但是司机也可能会使用另一辆汽车,或者选择步行而不使用汽车。
继承在多个维度上扩展一个类(汽车类型 × 引擎类型 × 驾驶类型),可能导致子类组合的数量爆炸。
组合将不同“维度”的功能抽取到各自的类层次结构中。
高层次的类不应该依赖于低层次的类。 两者都应该依赖于抽象接口。抽象接口不应依赖于具体实现。具体实现应该依赖于抽象接口。
有时人们会先设计低层次的类, 然后才会开发高层次的类。当你在新系统上开发原型产品时,这种情况很常见。由于低层次的东西还没有实现或不确定,你甚至无法确定高层次类能实现哪些功能。如果采用这种方式,业务逻辑类可能会更依赖于低层原语类。
依赖倒置原则通常和开闭原则共同发挥作用:你无需修改已有类就能用不同的业务逻辑类扩展低层次的类。
在本例中,高层次的预算报告类(BudgetReport)使用低层次的数据库类(MySQLDatabase)来读取和保存其数据。这意味着低层次类中的任何改变(例如当数据库服务器发布新版本时)都可能会影响到高层次的类,但高层次的类不应关注数据存储的细节。
要解决这个问题,你可以创建一个描述读写操作的高层接口,并让报告类使用该接口代替低层次的类。然后你可以修改或扩展低层次的原始类来实现业务逻辑声明的读写接口。
其结果是原始的依赖关系被倒置:现在低层次的类依赖于高层次的抽象。
以上就是今天要讲的内容,本文详细介绍了设计模式中软件设计原则与SOLID原则的使用,设计模式提供了大量的方法供我们使用,非常的便捷,我们务必掌握。希望大家多多支持!另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。加油啊!
本文发布于:2024-01-27 17:02:08,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063461271529.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |