面向对象设计原则
对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问
题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。
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) | 一个软件实体应当尽可能少地与其他实体发生相互作用 | ★★★☆☆ |
开闭原则
开闭原则是七大设计原则的基础。其定义如下:
开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实 体应尽量在不修改原有代码的情况下进行扩展。
使用的的前提是代码已经封板或者上线使用了,主要是为了提高代码的扩展性。
实现扩展的方式:
- 抽象并实现继承关系
- 面向接口编程,解耦
- 配置文件
- 脚本(groovy等)
里氏替换原则
里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透 明地使用其子类的对象。
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。子类中不要重写父类中的非抽象方法
依赖倒置原则
依赖倒转原则(Dependency Inversion Principle, DIP):抽象不应该依赖于细节,细节应当依 赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
在逻辑编写的过程中,不需要清楚实现过程。比如service在调用dao时就是使用的接口实现的。为了确保该原则的应用,一个具体类应当只实现接口或抽象类中声明过的方
法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。
在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入 (DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依 赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入 (Setter注入)和接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过 Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。 这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
单一职责原则
单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。
单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应 职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
- 如何去定义一个类
- 一个类由内在状态和外在行为组成
- 不要让一个类干太多的事情,这样不方便类的复用
- 最难使用的原则,因为如何对类的内在状态和外在行为进行分类汇总,是一件特别需要经验的事
接口隔离原则
接口隔离原则(Interface Segregation Principle, ISP):使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
- 如何去定义一个接口
- 接口主要是为了给类级别去提供增强的功能
- 每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干
合成复用原则
合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的。
要尽量使用组合/聚合关系(关联关系),少用继承。
迪米特法则
迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。
- 高内聚,低耦合
- 不要和陌生人说话,以下几类可以是朋友:
(1) 当前对象本身(this);
(2) 以参数形式传入到当前对象方法中的对象;
(3) 当前对象的成员对象;
(4) 如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;
(5) 当前对象所创建的对象。
总结
【开闭原则】是总纲,它告诉我们要【对扩展开放,对修改关闭】;【里氏替换原则】告诉我们【不要破坏继承 体系】;【依赖倒置原则】告诉我们要【面向接口编程】;【单一职责原则】告诉我们实现【类】要 【职责单一】;【接口隔离原则】告诉我们在设计【接口】的时候要【精简单一】;【迪米特法则】告 诉我们要【降低耦合度】;【合成复用原则】告诉我们要【优先使用组合或者聚合关系复用,少用继承 关系复用】。
正文到此结束
本文转自 http://blog.pkspace.cn/article/3,如有侵权,请联系删除。