面向对象设计的3个基本特征和5个原则
面向对象的基本特征
1.封装
简单来讲: 将现实世界的事物抽象成计算机领域中的对象,对象同时具有属性和行为,这种抽象就是封装.
封装的一个重要特性: 数据隐藏. 对象只对外提供与其它对象交互的必要接口,而将自身的某些属性和实现细节对外隐藏,
通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
这样就在确保正常交互的前提下,保证了安全性.
2.继承
面向对象的一个重要特性是复用性.继承是实现复用性的一个重要手段.
可以在不重复编写以实现的功能的前提下,对功能进行复用和拓展.
继承概念的实现方式有二类:实现继承与接口继承。
*实现继承是指直接使用基类的属性和方法而无需额外编码的能力
*接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力
3.多态
当存在继承关系时,允许将父类对象看成为和它的一个或多个子类对象等同.
这样,可以根据当前赋给父类对象的子对象的具体特性以不同的方式进行运行.
多态的几个前提
* a:要有继承关系。
* b:要有方法重写。
* c:要有父类引用指向子类对象。
多态的好处
* a:提高了代码的维护性(继承保证)
* b:提高了代码的扩展性(由多态保证)
多态的限制
* 不能使用子类的特有属性和行为。
五大基本原则
单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。
开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的,而在更改性方面应该是封闭的。
比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码
这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
替换原则(the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。
比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
依赖原则(the Dependency Inversion Principle DIP)
具体依赖抽象,上层依赖下层。
假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口: 这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。
通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。
接口分离原则(the Interface Segregation Principle ISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来