设计模式学习笔记(四)封装、继承、多态、抽象能解决什么问题?

面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。
1. 封装(Encapsulation)
所谓封装性,封装也叫做信息隐藏或者数据访问保护。 类通过暴露有限的访问 接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。
从Java Entity 类的结构上分析,类的成员变量都有get/set方法,而类变量本身都是private私有的。外部仅能通过 set/get 公共方法去操作成员变量,属性不能被直接修改,避免了数据不一致的问题发生。这里也就将该属性的方法和业务细节做了隐藏,使用者不需要了解详细的业务逻辑,只需要根据方法名就知道该方法的作用从而去调用即可。
2. 抽象(Abstraction)
抽象讲的是如何隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。
 
Java 中的使用接口类( interface 关键字语法)或者抽象类( abstract 关键字语法)这两种语法机制,来实现抽象这一特性。
举例说,类A是一个interface修饰的接口类,有个save()方法,类B是个普通类,它实现了类A以及重写了save() 方法。
这里我们利用 Java 中的 interface 接口语法来实现抽象特性。调用者在使用save()方法的时候,只需要了解类A这个接口类暴露了哪些方法就可以了,不需要去查看 PictureStorage 类里的具体实现逻辑。
抽象作为一个非常宽泛的设计思想,在代码设计中,起到非常重要的指导作用。很多设计原则都体现了抽象这种设计思想,比如基于接口而非实现编程、开闭原则(对扩展开放、对修改关闭)、代码解耦(降低代码的耦合性)等。
换一个角度来考虑,我们在定义(或者叫命名)类的方法的时候,也要有抽象思维,不要在方法定义中,暴露太多的实现细节,以保证在某个时间点需要改变方法的实现逻辑的时候,不用去修改其定义
3. 继承(Inheritance)
继承是用来表示类之间的 is-a 关系,比如猫是一种哺乳动物。从继承关系上来讲,继承可以分为两种模式,单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以继承多个父类,比如猫既是哺乳动物,又是爬行动物。
编程语言提供特殊的语法机制来支持继承的特性,比如 Java 使用extends 关键字来实现继承,C++ 使用冒号(class B : public A),Python 使用paraentheses(),Ruby 使用 <。不过,有些编程语言只支持单继承,不支持多重继承,比如 Java、PHP、C#、Ruby 等,而有些编程语言既支持单重继承,也支持多重继承,比如C++、Python、Perl 等。
继承最大的一个好处就是代码复用。假如两个类有一些相同的属性和方法,我们就可以将这些相同的部分,抽取到父类中,让两个子类继承父类。这样,两个子类就可以重用父类中的代码,避免代码重复写多遍。不
4. 多态(Polymorphism)
多态是指,子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。
例如:类B继承类A,并重写类A中的方法;此时,类A为父类,类B为子类。
多态这种特性也需要编程语言提供特殊的语法机制来实现。
  1. 第一个语法机制是编程语言要支持父类对象可以引用子类对象,也就是 B b = new A() ;
  2. 第二个语法机制是编程语言要支持继承,也就是类B能使用类似  "extends B" 的语法;
  3. 第三个语法机制是编程语言要支持子类可以重写(override)父类中的方法。
对于多态特性的实现方式,除了利用“继承加方法重写”这种实现方式之外,我们还有其他两种比较常见的的实现方式,一个是利用接口类语法,另一个是利用 duck-typing 语法。不过,并不是每种编程语言都支持接口类或者 duck-typing 这两种语法机制,比如 C++就不支持接口类语法,而 duck-typing 只有一些动态语言才支持,比如 Python、JavaScript 等。
什么是 duck-typing 语法?
只要两个类具有相同的方法,就可以实现多态,并不要求两个类之间有任何关系,这就是所谓的 duck-typing,是一些动态语言所特有的语法机制。而像 Java 这样的静态语言,通过继承实现多态特性,必须要求两个类之间有继承关系,通过接口实现多态特性,类必须实现对应的接口。
多态的意义多态特性能提高代码的可扩展性和复用性。

猜你喜欢

转载自blog.csdn.net/weixin_42405670/article/details/121890140