前言
当我们提起面向对象的时候可能最快想到的是面向对象的几个特性吧,今天我们就重点来聊聊这些特性,因为在我们学习设计模式时,需要完全理解这四个特性。
封装性
- 对于封装我们可能常想到的就是将一段代码封装成一个方法然后再加几个参数,虽然我们经常这样,但是我想说的是这不是封装的真正含义;
- 封装的真实的含义是数据保护以及信息隐藏。这句话的解读就是:不论方法或者类,只提供有限的参数,供外部进行访问与调用。
- 把紧密的相关的信息放在一起,形成一个单元一层层的逐步向上不断构建更大的单元,
- 重点:对象提供哪些行为,不是有哪些数据。对行为的封装。单一原则就是基于此特性的。
数据保护与信息隐藏
- 减少内部实现细节的暴露
- 减少对外暴露的接口
如何设计一个类
- 先考虑其对象应该提供哪些行为
- 根据行为提供对应的方法
- 考虑实现这些方法要有哪些字段
好的封装优点
- 提高类的易用性
- 降低调用者的使用难度
- 提高代码的模块性
坏的封装缺点
- 增加代码的复杂度
- 降低代码的可读性
- 安全性降低
继承
继承代表的就是类之间的关系是 is-a的关系,比如小汽车 是交通工具,交通工具就是父类 小汽车就是子类。在代码实现中基本是使用 extend 。
- 实现继承:我们可以看到这种继承是站在子类的角度往上看,面对的是子类。is-a
- 接口继承:站在父类的角度往下看,面对的是父类. has-a (更多是多态)
class car extends vehicle
{
}
优点
- 子类可以继承父类的代码.
- 复用代码
- 减少代码重复
缺点
如果层级过多,将会导致代码
- 可读性降低
- 复杂性增加
- 可维护性降低
总结
尽量少的使用实现继承,多用接口继承。
多态
多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
掌握多态也是我们对面向对象认知的一个分水岭。对于理解多态,我们就需要对接口进行了解,并理解接口的价值,在接口的构建当中,我们就需要做到,将变的部分由子类去各自实现,而不变的就是接口的约定。
接口是一个边界,清晰界定不同模块的职责。
基于接口的多态示例:
interface Pay{
public function pay();
}
class AliPay implements Pay
{
public function pay()
{
// 阿里支付
}
}
class WeiXinPay implements Pay
{
public function pay()
{
// 微信支付
}
}
实现方式
- 继承
- 接口
- …
总结
- 作为程序员我们需要有识别出变与不变的能力,这样我们才能更好的构建多态性的架构。
- 多态是基于对象与面向对象的分水岭,多态需要找出不同事物的共同点,建立起抽象。重点找出共同点,前提是分离关注点。
- 理解多态,还要理解接口,它是将变与不变的部分隔离开来,在二者之间建立起一个边界。
- 多态是大多数走向高级必要深刻理解的特性。
抽象性
抽象讲的是如何隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。
实现抽象性的方法
- 抽象类 abstract 抽象方法
- 接口 interface
抽象的意义
抽象作为一个非常宽泛的设计思想,在代码设计中,起到非常重要的指导作用。很多设计原则都体现了抽象这种设计思想,比如基于接口编程,开闭原则,代码解耦等。