OOP(Object Oriented Programming)面向对象编程
OOP:面向对象编程(Object Oriented Programming)
说到面向对象就不得不提一下面向过程:
面向过程——步骤化
面向过程就是分析出实现需求所需要的步骤,通过函数一步一步实现这些步骤,接着依次调用即可
面向对象——行为化
面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为
面向对象编程OOP:是一种计算机编程架构。
OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。
OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。OOP=对象+类+继承+多态+消息,其中核心概念是类和对象。
面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成。
类是对现实世界的抽象,包括表示静态属性的数据和对数据的操作,对象是类的实例化。
对象间通过消息传递相互通信,来模拟现实世界中不同实体间的联系。
面向对象的程序设计中,对象是组成程序的基本模块。
OOP有三大特性和五大原则:
三大特性
1.封装
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。
数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外的接口使其与外部发生联系。
用户无需关心对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
优点︰
- 减少耦合∶可以独立地开发、测试、优化、使用、理解和修改
- 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块有效地调节性能∶可以通过剖析来确定哪些模块影响了系统的性能
- 提高软件的可重用性
- 降低了构建大型系统的风险︰即使整个系统不可用,但是这些独立的模块却有可能是可用的
2.继承
继承实现了IS-A关系(类的父子继承关系),子类可以继承自父类,从而获得父类非private的属性和方法。
继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
子类可以当做父类来使用,也就是说可以使用父类引用子类对象。父类引用指向子类对象称为向上转型。
Animal animal = new cat();
继承分为实现继承和接口继承,继承的时候涉及到两个概念:方法重载、方法重写
继承是多态的前提。
3.多态
多态分为编译时多态和运行时多态:
1.编译时多态主要指方法的重载
2.运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定运行时多态有三个条件:
- 继承
- 覆盖(重写)
- 向上转型
五大原则(Five Principle)
- 开放封闭原则 Open Close Principle
定义:一个软件实体应当对扩展开放,对修改关闭
关键:通过抽象封装可变元素
目的:在不修改源代码的情况下改变模块的行为
- 单一职责原则 Single Responsibility Principle
定义:一个对象应该只包含单一的职责。并将该职责完整的封装到一个类中。
另一种定义:就一个类而言,应该仅有一个引起它变化的原因。
关键:单一职责,高内聚,低耦合
目的:高内聚,低耦合
- 里氏替换原则 Liskov Substitution Principle
是实现开闭原则的重要方式之一
定义:所有引用基类的地方都能透明的使用其子类。是实现开闭原则的重要方式之一。
目的:在程序中尽量使用积累类型来对对象进行定义,而在运行时在确定其子类类型。
- 依赖倒置原则 Dependence Inversion Principle
是实现开闭原则的主要手段
定义:高层模块不应该依赖底层模块,都应该依赖抽象,细节依赖于抽象,抽象不依赖于细节。
常用实现方式:在代码中使用抽象类,而将具体类放在配置文件中。
- 接口分离原则 Interface segregation Principle
定义:客户端不应该依赖那些它不需要的接口interface(这里的接口指的是所定义的方法)。
另一种定义:一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需要知道与之相关的方法即可。
补充:(七大设计原则包括上面的oop五大原则和以下两大设计原则)
- 迪米特法则 Law of Demeter(最少知识原则 Least Knowledge Principle)
定义1:不要和陌生人说话
定义2:至于你的直接朋友通信
一个软件实体应当尽可能少的与其他实体发生相互作用
狭义的迪米特法则:降低类之间的耦合
广义的迪米特法则:指对对象之间的信息流量、流向以及信息的影响的控制,信息隐藏可以使各个子系统脱耦,而独立开发、优化等。
- 合成复用原则 Composite Reuse Principle
定义:尽量使用对象组合,而不是继承来达到复用的目的。
实现:多使用聚合、组合关系,少用继承。