面向对象编程语言的四大特性: 封装、抽象、继承、多态。
- 封装:也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。对于封装这个特性,我们需要编程语言本身提供一定的语法机制来支持。这个语法机制就是 访问权限控制。(public、protected、private)
- 抽象:讲的是如何隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知 道这些功能是如何实现的。(比如 Java 中的 interface 关键字 语法)或者抽象类(比如 Java 中的 abstract 关键字语法)。我们在定义(或者叫命名)类的方法的时候,也要有抽象思维,不要在 方法定义中,暴露太多的实现细节,以保证在某个时间点需要改变方法的实现逻辑的时候, 不用去修改其定义。
- 继承:是用来表示类之间的 is-a 关系,分为两种模式:单继承和多继承。最大的一个好处就是代码复用。
- 多态:是指,子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。多态可 以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。
抽象类具有三个特性:
- 抽象类不允许被实例化,只能被继承。也就是说,你不能 new 一个抽象类的对象出来。
- 抽象类可以包含属性和方法。方法既可以包含代码实现,也可以不包含代码实现。不包含代码实现的 方法叫作抽象方法。
- 子类继承抽象类,必须实现抽象类中的所有抽象方法。
设计模式的精髓是对多态的使用。
下面使用PHP的一个简单案例,说明多态的含义:
<?php
/**
* PHP中的多态:
* 定义一个抽象类:Person,有两个子类:Worker 和 Student
*/
/**
* 定义一个抽象父类
*/
abstract class Person {
public abstract function action();
}
/**
* 两个子类,继承父类
*/
class Worker extends Person {
public function action() {
echo '工人去上班' . PHP_EOL;
}
}
class Student extends Person {
public function action() {
echo '学生去上学' . PHP_EOL;
}
}
/**
* 其它的类, 不继承自Person
*/
class Ufo {
public function action() {
echo '外星人的行为...' . PHP_EOL;
}
}
/**
* 调用
*/
function main($person) {
$person->action();
}
main(new Worker()); //工人去上班
main(new Student()); //学生去上学
main(new Ufo()); //外星人的行为...
源代码:https://gitee.com/rxbook/php_design_pattern/blob/master/code01_Polymorphism.php