面向对象相关知识点
- 概念
面向对象 (Object Oriented, OO) 是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术 [1] 发展到一定阶段后的产物。
- 三大特点
a) 封装
封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
b) 继承
面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。 继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
c) 多态
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。多态存在的三个必要条件:继承、重写、父类引用指向子类对象
- 应用范围
面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)
- 面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)
面向对象的基本思想:
- 从现实世界中客观存在的事物出发来建立软件系统,强调直接以问题域(现实世界)中的事物为中心来思考问题、认识问题,并根据这些事物的本质特征,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。这可以使系统直接映射问题域,保持问题域中事物及其相互关系的本来面貌(对象)
- 用对象的属性表示事物的性质;用对象的操作表示事物的行为。(属性与操作)
- 对象的属性与操作结合为一体,成为一个独立的、不可分的实体,对外屏蔽其内部细节。(对象的封装)
- 对事物进行分类。把具有相同属性和相同操作的对象归为一类,类是这些对象的抽象描述,每个对象是它的类的一个实例。 (分类)
- 复杂的对象可以用简单的对象作为其构成部分。(聚合)
- 通过在不同程度上运用抽象的原则,可以得到较一般的类和较特殊的类。特殊类继承一般类的属性与操作,从而简化系统的构造过程及其文档。(继承)
- 类具有封闭性,把内部的属性和操作隐藏起来,只有公共的操作对外是可见的。 (类的封闭性)
- 对象之间通过消息进行通讯,以实现对象之间的动态联系。 (消息)$a->test();
- 通过关联表达类(一组对象)之间的静态关系。(关联)
面向对象分析方法:
Booch方法(OOD)
Coad 和 Yourdon 方法(OOA&D)
Jacobson 方法(OOSE)
Rumbauph方法(OMT)
Wassman-Pircher方法(OOSD)等
一、 找出候选的类(对象)
- 1、找出问题领域中的五类事物作为候选类(对象)
d) 可感知的物理实体,如:书、汽车
e) 人或者组织的角色,如:老师、员工、用户、客户
f) 应该记忆的事件,如:演出、访问
g) 两个或者多个对象的相互作用,通常具有交易或接触的性质,如:购买、结婚
h) 需要说明的概念,如:政策
- 将需求分析中的名词或名词短语作为候选
i) 例:各剧院的演出售票预定系统
剧院、演出、票、预定、系统
例:企业信息管理系统
公司、部门、经理、产品、员工、工人、项目
二、 筛选出正确的类(对象)
从候选对象中去掉不正确或者不必要的类(对象),遵循以下原则:
冗余的:两个类表示了相同的信息
无关的:
笼统的:(模糊的)用精确的代替
属性:去掉无关的属性
操作:动词定义的操作是否为类
实现:分析阶段少或不考虑怎样实现目标系统
三、 确定关联:两个或者多个对象之间的相互依赖,相互作用关系就是关联。
a) 抽取需求陈述中使用的描述性动词或者动词词组
b) 找到隐含的关联关系
c) 补充一些必要的关联关系
d) 去掉不正确或者不必要的关联
面向对象设计:七大原则
1、 单一职责(SRP:Single responsibility principle)
1)定义
不要存在多于一个导致类变更的原因
2)基本概念
单一职责是高内聚低耦合的一个体现
说明:通俗的讲就是一个类只能负责一个职责,修改一个类不能影响到别的功能,也就是说只有一个导致该类被修改的原因
3)优点
低耦合性,影响范围小
降低类的复杂度,职责分明,提高了可读性
变更引起的风险低,利于维护
2、 开闭原则(OCP:Open Closed Principle)
1)定义
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
2)基本概念
开:对扩展开放,支持方便的扩展
闭:对修修改关闭,严格限制对已有的内容修改
说明:一个软件产品只要在生命周期内,都会发生变化,即然变化是一个事实,我们就应该在设计时尽量适应这些变化,以提高项目的稳定性和灵活性,真正实现“拥抱变化”。开闭原则告诉我们应尽量通过扩展软件实体的行为来实现变化,而不是通过修改现有代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则
3)优点
提高系统的灵活性、可复用性和可维护性
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
3、 里氏代换原则(LSP:Liskov Substitution Principle)
1)定义
定义一:所有引用基类的地方必须能透明地使用其子类的对象。
定义二:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
2)基本概念
强调的是设计和实现要依赖于抽象而非具体;子类只能去扩展基类,而不是隐藏或者覆盖基类它包含以下4层含义
1)子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2)子类中可以增加自己特有的方法。
3)当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4)当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
3)优点
开闭原则的体现,约束继承泛滥
提高系统的健壮性、扩展性和兼容性
4、 依赖倒转原则(DIP:Dependence Inversion Principle)
1)定义
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。
2)基本概念
依赖倒置原则的核心就是要我们面向接口编程,理解了面向接口编程,也就理解了依赖倒置
低层模块尽量都要有抽象类或接口,或者两者都有
变量的声明类型尽量是抽象类或接口
使用继承时遵循里氏替换原则
设计和实现要依赖于抽象而非具体。一方面抽象化更符合人的思维习惯;另一方面,根据里氏替换原则,可以很容易将原来的抽象替换为扩展后的具体,这样可以很好的支持开-闭原则
3)优点
减少类间的耦合性,提高系统的稳定性
降低并行开发引起的风险
提高代码的可读性和可维护性
5、 接口分离原则(ISP:Interface Segregation Principle)
1)定义
定义一:客户端不应该依赖它不需要的接口
定义二:类间的依赖关系应该建立在最小的接口上
2)基本概念
一个类对另一个类的依赖应该建立在最小的接口上,通俗的讲就是需要什么就提供什么,不需要的就不要提供
接口中的方法应该尽量少,不要使接口过于臃肿,不要有很多不相关的逻辑方法
3)优点
高内聚,低耦合
可读性高,易于维护
6、 合成复用原则(CRP:Composite Reuse Principle)
1) 定义
尽量采用组合(contains-a)、聚合(has-a)的方式而不是继承(is-a)的关系来达到软件的复用目的
2)基本概念
如果新对象的某些功能在别的已经创建好的对象里面已经实现,那么应当尽量使用别的对象提供的功能,使之成为新对象的一部分,而不要再重新创建
组合/聚合的优缺点:类之间的耦合比较低,一个类的变化对其他类造成的影响比较少,缺点:类的数量增多实现起来比较麻烦
继承的优点:由于很多方法父类已经实现,子类的实现会相对比较简单,缺点:将父类暴露给了子类,一定程度上破坏了封装性,父类的改变对子类影响比较大
3)优点
可以降低类与类之间的耦合程度
提高了系统的灵活性
7、 迪米特原则(LOD:Law of Demeter)
1)定义
一个对象应该对其他对象保持最少的了解
这个原理的名称来源于希腊神话中的农业女神,孤独的得墨忒耳。
2)基本概念
每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元;
每个单元只能和它的朋友交谈:不能和陌生单元交谈;
只和自己直接的朋友交谈。
3)优点
使得软件更好的可维护性与适应性
对象较少依赖其它对象的内部结构,可以改变对象容器(container)而不用改变它的调用者(caller)
UML类图:
PHP 语言抽象类,抽象接口
abstract
interface
区别?
联系?
需求:
1、 A乘坐汽车上班,B骑自行车上班,C坐地铁上班;
Person implements Action jiaotonggongju interface Action shanb();
A B C car bike subway
2、 A 会说普通话和英语,B会说英语、韩语、日语,C会说四川方言;
Persion implement Action language Action speak
A B C Guoyu waiyu
Pu fang ying han ri
Check(Action $action) {
$action->speack();
$action->shangb();
}
3、 做一个图书商城,商城里面卖纸质和电子书,书籍类型有小说、计算机、文学、数学等等,用户可以浏览相关书籍介绍,目录,并且将其加入购物车,用户一次下单可以购买多本图书。部分图书会根据销售情况做一些推销活动(打折,满减);
有一座m层楼(1-m),有一部电梯,来接待不同楼层的乘客。电梯运载量为n。