https://www.kancloud.cn/digest/xing-designpattern/143719
对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。在面向对象设计中,可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平。
面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。面向对象设计原则也是我们用于评价一个设计模式的使用效果的重要指标之一,在设计模式的学习中,大家经常会看到诸如“XXX模式符合XXX原则”、“XXX模式违反了XXX原则”这样的语句。
最常见的7种面向对象设计原则如下表所示:
表1 7种常用的面向对象设计原则
|
设计原则名称 |
定 义 |
使用频率 |
|
单一职责原则 (Single Responsibility Principle, SRP) |
一个类只负责一个功能领域中的相应职责 |
★★★★☆ |
|
开闭原则 (Open-Closed Principle, OCP) |
软件实体应对扩展开放,而对修改关闭 |
★★★★★ |
|
里氏代换原则 (Liskov Substitution Principle, LSP) |
所有引用基类对象的地方能够透明地使用其子类的对象
|
★★★★★ |
|
依赖倒转原则 (Dependence Inversion Principle, DIP) |
抽象不应该依赖于细节,细节应该依赖于抽象 |
★★★★★ |
|
接口隔离原则 (Interface Segregation Principle, ISP) |
使用多个专门的接口,而不使用单一的总接口 |
★★☆☆☆ |
|
合成复用原则 (Composite Reuse Principle, CRP) |
尽量使用对象组合,而不是继承来达到复用的目的
|
★★★★☆ |
|
迪米特法则 (Law of Demeter, LoD) |
一个软件实体应当尽可能少地与其他实体发生相互作用 |
★★★☆☆
|
总结:
1、 单一职责是关于角色和高层架构的。开闭原则负责的是类的设计和功能拓展。里氏代换原则是关于子类类型化和继承的。而接口隔离原则(ISP)是关于和应用代码交互的业务逻辑。
问题:
问题一:里氏代换与多态是不是相矛盾,里氏代换的含义中包含:子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。
多态肯定是要重写的。 我觉得应该是尽量避免重载或覆盖父类的方法。主要还是看方法的职责,如果相同,则可以重写,否则就要另写方法。这个职责划分需要自己分析。
详见:https://www.cnblogs.com/hellojava/archive/2013/03/15/2960905.html
问题二:依赖倒置原则与类的接口多继承是不是相矛盾? 依赖倒置中说的 “应当”
问题三:为什么声明了接口,却不用接口来依赖倒置??如spring中的AliasRegistry
面向接口编程
问题四:什么是面向接口编程?他的好处是什么?
问题五:spring中的Beanfactory集成体系为啥那么复杂?