面向对象设计原则
2016-05-26 21:51
232 查看
今天整理了一下面向对象设计的七种设计原则,整理了以下学习笔记。
1、 单一职责原则Single ResponsibilityPrinciple,SRP
一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。(就一个类而言,应该仅由一个引起它变化的原因)。
单一职责原则是实现高内聚、低耦合的指导方针,是最简单、却最难运用的原则,需要设计人员发现类的不同职责并将其分离。
2、 开闭原则Open-Closed Principle,OCP
软件实体应当对扩展开放,对修改关闭。
开闭原则是指软件实体应尽量在不修改原有代码的情况下进行扩展。
3、 里氏代换原则Liskov Substitution Principle,LSP
所有引用基类的地方必须能透明的使用其子类的对象。
里氏代换原则表明,在软件中一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。里氏代换原则是实现开闭原则的基础,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型对对象进行定义,而在运行时在确定其子类类型,用子类对象来替换父类对象。
在运用里氏代换原则时,应该将父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法。
4、 依赖倒转原则Dependency Inversion Principle,DIP
高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
原则要求:要针对接口编程,而不是针对实现编程。
在实现依赖倒转原则时,需要针对抽象层进行编程,而将具体类的对象通过依赖注入(Dependency Injection,DI)的方式注入其他对象中。
说明1:依赖注入是指当一个对象要与其他对象发生依赖关系时,通过方法参数来注入所依赖的对象。依赖注入包含三种方式:
1) 构造注入:通过构造函数来传入具体类的对象;
2) 设值注入:通过Setter方法来传入具体类的对象;
3) 接口注入:通过在接口中声明的业务来传入具体类。
这三种方法定义时用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
说明2:在重构过程中,一般同时使用开闭,里氏代换和依赖倒转原则。其中开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。
5、 接口隔离原则Interface SegregationPrinciple,ISP
客户端不应该依赖那些它不需要的接口。
这里的接口含义:
1) 一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;
2) 一种是某种语言具体的“接口”,有严格的定义和结构。
6、 合成复用原则Composite Reuse Principle,CRP
优先使用对象组合,而不是继承来达到复用的目的。
在一个新的对象里通过关联关系(包含组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用功能的目的。
即:复用时要尽量使用组合/聚合关系(关联关系),少使用继承。
7、 迪米特法则Law of Demeter LoD
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用。
迪米特法则要求限制软件实体之间通信的宽度和深度。
1、 单一职责原则Single ResponsibilityPrinciple,SRP
一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。(就一个类而言,应该仅由一个引起它变化的原因)。
单一职责原则是实现高内聚、低耦合的指导方针,是最简单、却最难运用的原则,需要设计人员发现类的不同职责并将其分离。
2、 开闭原则Open-Closed Principle,OCP
软件实体应当对扩展开放,对修改关闭。
开闭原则是指软件实体应尽量在不修改原有代码的情况下进行扩展。
3、 里氏代换原则Liskov Substitution Principle,LSP
所有引用基类的地方必须能透明的使用其子类的对象。
里氏代换原则表明,在软件中一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。里氏代换原则是实现开闭原则的基础,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型对对象进行定义,而在运行时在确定其子类类型,用子类对象来替换父类对象。
在运用里氏代换原则时,应该将父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法。
4、 依赖倒转原则Dependency Inversion Principle,DIP
高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
原则要求:要针对接口编程,而不是针对实现编程。
在实现依赖倒转原则时,需要针对抽象层进行编程,而将具体类的对象通过依赖注入(Dependency Injection,DI)的方式注入其他对象中。
说明1:依赖注入是指当一个对象要与其他对象发生依赖关系时,通过方法参数来注入所依赖的对象。依赖注入包含三种方式:
1) 构造注入:通过构造函数来传入具体类的对象;
2) 设值注入:通过Setter方法来传入具体类的对象;
3) 接口注入:通过在接口中声明的业务来传入具体类。
这三种方法定义时用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。
说明2:在重构过程中,一般同时使用开闭,里氏代换和依赖倒转原则。其中开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。
5、 接口隔离原则Interface SegregationPrinciple,ISP
客户端不应该依赖那些它不需要的接口。
这里的接口含义:
1) 一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;
2) 一种是某种语言具体的“接口”,有严格的定义和结构。
6、 合成复用原则Composite Reuse Principle,CRP
优先使用对象组合,而不是继承来达到复用的目的。
在一个新的对象里通过关联关系(包含组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用功能的目的。
即:复用时要尽量使用组合/聚合关系(关联关系),少使用继承。
7、 迪米特法则Law of Demeter LoD
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用。
迪米特法则要求限制软件实体之间通信的宽度和深度。
相关文章推荐
- 数据结构基础知识(二)
- Internet标准时间RFC3339格式说明
- UE4之SlateUI系统初探
- 剑指Offer之在O(1)时间删除链表节点(题13)
- 【Leetcode】Different Ways to Add Parentheses
- 原理设计思想
- 剑指Offer——翻转单词顺序VS左旋转字符串
- C++快速入门-命名空间
- 链表相关题目的实现
- 工厂方法模式及php实现
- Java中HashMap遍历的两种方式比较
- 【Leetcode】Patching Array
- 联想功能字符串的提取(c)
- cocoaPods安装步骤
- 获取本机IP地址
- Markdown使用说明
- java Map及Map.Entry详解
- 【Leetcode】Minimum Path Sum
- java对象数组的初始化
- MVC简介