目录
面相对象
1、基础知识
对象 = 对象名 + 属性 + 方法(关键字和注释不能作为标识符给对象命名)
变量和常量都有属性,但是变量有对应的存储单元,用来赋值修改,常量没有
类:是对象的模版,类是对具有相同操作方法和一组相同数据元素的对象的行为和属性的抽象与总结
消息对象之间进行通信的机制,是对象图上的标志,但是不是对象的组成成分
对象的组成部分包括:对象名,状态(属性),行为(操作)。类是对对象共有属性和行为的抽象,因此一个类定义的对象共享行为和属性
面向对象程序设计语言不通过指针进行
聚合对象:一个对象包含其他对象
主要特征:
-
继承:定义了超类和子类的关系(两个及以上的超类称为多重继承会出现二义性问题)
-
多态:不同对象收到同一个消息可以产生不同结果
-
重载:是一个类拥有多个同名不同参数的方法
-
过载:同一个名操作符或函数,不同的上下文有不同的类型
-
覆盖:子类重写父类的方法
-
包含多态:同样的操作可用于一个类型及其子类型。
-
强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求
-
参数多态:采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。
-
-
封装:使得数据和加工数据的方法变成一个独立性很强的模块,private只有此类中定义的方法可以访问
绑定:函数调用和响应调用所需代码结合的过程
-
静态绑定:程序编译时
-
动态绑定:程序执行时,支持多态
抽象类是不能实例化的类,抽象类的子类必须实现抽象类所有抽象方法
-
抽象类是不能产生直接对象的!!!
接口是一组方法声明的集合 Interface
面相对象分析阶段,架构师主要关注系统的行为
引用调用:实参的地址传给形参
函数 D_count(变量a1, 变量a2){ return integer //函数体先给出函数的返回值类型 begin declare d_count integer; //函数体执行内部,先声明函数变量 ··· ··· end }
2、UML
UML(Unified Model Language):统一建模语言
2.1 基本元素
2.2 常见UML关系
关联:是一个结构关系,描述了一组链。两个类之间,可以有多个由不同角色标识的关联
-
试卷和用户(付费学员和普通用户)
组合关系:强关联关系,contain-a,部分和整体有相同的生命周期,部分离开整体或整体消失,都无法正常运行
聚合关系:弱关联关系,has-a,整体与部分相对独立,并没有相同的生命周期
扩展关系:extend指向主要活动,extend离的近的是主要活动
包含关系:include指向被包含的活动
3、图
UML图
-
结构图:类图、对象图、构件图、组合图、包图 反映静态结构
-
行为图:用例图、活动图、状态机图、顺序图、通信图、定时图、交互图
图名 | 特点 |
---|---|
类图 | 类与类间的联系 对象、接口、协作和它们之间的关系 类和类之间有比例的关系 |
对象图 | 描述某一时刻或一个时间点上各个对象的快照 对象是一个具体的事物,因此属性后有具体的值 包含类时,必须加上 : 和 __,如 :Order 对象图上没有消息,通信图上有消息 |
包图 | 对语义联系紧密的事物进行分组 用带标签的文件夹符号表示之间的关系 |
用例图 | 描述系统与外部系统和参与者的关系 有参与者,有用例,有系统边界 |
构件图 | 描述一组构件间的依赖与连接,对外提供接口访问 接口间的依赖关系 有供接口和需接口 |
组合图 | 显示分类器(类、构件、用例)的内部结构 船(螺旋桨—转轴—发动机) |
顺序图 | 描述对象间消息的发送与接收,重点在于强调顺序 消息上有箭头,代表发送和返回的顺序区间,有焦点、对象间有一定顺序 控制焦点用矩形表示,表示一个对象执行一个动作所经历的时间段 顶部表示动作开始,底部表示动作结束 返回虚线代表返回消息,实线代表方法 对象销毁用 ‘X’ 来表示 |
通信图 | 描述对象间的交互,重点是连接 对象间通过消息通信 |
定时图 | 给出消息经过不同对象的具体时间 |
部署图 | 软硬件间的物理联系 |
交互图 | 顺序图+活动图 |
活动图 | 对业务处理流程的描述,描述业务行为和并行行为 有业务流程、有业务判断(菱形)分支和监护表达式 每条箭线上不一定都会有事件 |
状态机图 | 描述对象状态转换 状态图中每个结点对应的是状态,而状态与状态之间的变迁涉及到事件触发 所以在状态图中,每条箭线上都会有事件 |
状态转换:原状态和目标状态,在发生特定事件触发警戒条件满足时的状态转换,描述两个状态的一种关系。
活动图
顺序图
4、设计模式
4.1 原则
设计原则 | 定义 | 特点 |
---|---|---|
单一职责 | 一个类,应仅有一个引起它变化的原因 | 一个类,应仅有一个引起它变化的原因 |
开放封闭 | 不可以修改源代码的基础上,新增功能 | 对扩展开放,对修改关闭 构造抽象隔离 |
接口隔离 | 客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上 | 使用多个专门的接口比使用单一的总接口要好 |
共同重用 | 一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么也就相当于重用了包中的所有类 | 一个包中所有的类共同重用 |
共同封闭 | 一个变化若对一个封闭的包产生影响,则将对该包中的所有类产生影响,而对于其他包则不造成任何影响 | 包中的所有类对于同一种性质的变化应该是共同封闭的,对于其他包则不造成任何影响 |
依赖倒转 | 高层模块不应依赖于低层模块,两者都依赖于抽象 针对接口编程,而不是针对实现编程 | 抽象不应该依赖于细节 细节应该依赖于抽象 |
里式替换 | 类型S的对象s1,存在类型T的对象t2, s1替换t2后,程序功能不受影响,S是T的子类型 | 子类替换父类,且功能不受影响 |
4.2 分类
设计模式按照用途分:
-
创建型设计模式:工厂方法、抽象工厂、生成器模式、单例模式、原型模式
-
结构型设计模式:适配器模式、桥接模式、组合模式、装饰模式、外观模式、代理模式、享元模式
-
行为型设计模式:模版模式、解释器模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式
按照作用对象分:
-
类模式:工厂方法、适配器模式、模版模式、解释器模式
-
对象模式:剩下的其他
依附于一个元素或一组元素之上对其进行约束或解释的简单符号为( 注释 )事物
4.2.1 创建型设计模式
描述如何创建、组合、表示对象
4.1.1 工厂方法
目的 | 定义一个接口,用于创建对象,该模式由子类决定实例化哪个工厂类 |
---|---|
构成 | 抽象工厂(核心)、具体工厂、抽象产品、具体产品 |
特点 | 工厂方法就是把客户类和工厂类分开,客户需要某种商品,只需向工厂提出,而无需自我改变 适用于父类利用子类创建对象 |
举例 | 生产两种不同的口罩,医用型和N95型 |
结构图 |
4.1.2 抽象工厂
目的 | 提供一个接口用于创建一组相关或相互依赖的对象 工厂方法只能生产一类产品,而抽象工厂能生产相关联多类产品 |
---|---|
构成 | 抽象工厂(核心)、具体工厂、抽象产品、具体产品 抽象工厂中的方法和抽象产品的个数不同 |
特点 | 增加一类新产品、配置一系列相关产品很容易 工厂方法关注同等级产品生产,抽象工厂关注一个产品族生产 |
举例 | 分别生产A、B两种级别的医用型和N95型 针对不同的平台定义一系列的组件 |
结构图 |
4.1.3 生成器模式(builder)⭐️
目的 | 将一个复杂对象分解为多个简单对象 |
---|---|
构成 | 指挥者、产品、抽象建造者、具体建造者 |
特点 | 将复杂对象的构建与其表示分离 抽象复杂对象的构建步骤,允许构造对象有不同的表示 |
举例 | 例如:生产一台电脑 = 显示器 + 机箱 + CPU + 硬盘 生成器模式可以把电脑结构的组成和部件生产完全分开 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 |
结构图 |
4.1.4 单例模式
目的 | 一个类只有一个自身创建的实例,提供该实例给所有其他对象 |
---|---|
构成 | 单例类、访问类 |
特点 | 类只有一个实例 |
举例 | 如系统只能打开一个回收站、系统中的计算器、应用程序中的对话框 |
结构图 |
4.1.5 原型模式
目的 | 指定一个已创建的实例作为原型,通过复制该原型来创建对象 |
---|---|
构成 | 访问类、抽象原型、具体原型 |
特点 | 具体原型是基于抽象原型的复制 |
举例 | windows安装和Ghost镜像安装 |
结构图 |
4.2.2 结构型设计模式
如何组合类和对象成为更大的结构,该模式一般使用继承,将一个或多个类、对象进行组合、封装
4.2.1 适配器模式
目的 | 类适配器模式:使用多重继承,进行接口间匹配(继承) 对象适配器模式:该模式依赖于对象组合(聚合) |
---|---|
构成 | 原适配者、适配器、目标接口 |
特点 | |
举例 | 美国交流电插头—转换头—中国交流电插头 |
结构图 |
4.2.2 桥接模式
目的 | 分离抽象与实现,使他们都可以独立变化 |
---|---|
构成 | 抽象化、扩展抽象化、实现化、具体实现化 |
特点 | 不同抽象接口和实现可以组合和扩充 程序运行时,动态选择、切换具体实现 采用组合关系代替继承关系,解决多维度扩展问题 |
举例 | 用户买门,门有两种维度变化因素:推拉方式(推拉门/折叠门)和材质(木门/铁门) |
结构图 |
4.2.3 组合模式
目的 | 用树型的结构,表示部分与整体的关系 |
---|---|
构成 | 抽象构件、树叶构件、树枝构件(抽象构件的部分) |
特点 | 对象部分-整体的结构 |
举例 | 文件、子文件夹、文件夹 |
结构图 |
4.2.4 装饰模式
目的 | 不改变真实对象的类结构,又可以动态额外增加功能 |
---|---|
构成 | 抽象构件、具体构件、抽象装饰、具体装饰 |
特点 | 将一个对象加以包装,以提供额外行为 |
举例 | 新增QQ皮肤 |
结构图 |
4.2.5 外观模式
目的 | 为子系统中的一系列接口提供一个一致的界面,一个高层接口 |
---|---|
构成 | 客户、外观、子系统 |
特点 | 为一系列复杂模块提供了统一接口的外接访问模块 提高子系统独立性,子系统变化不会影响调用它的客户类 减少低水平开发者风险 |
举例 | 民众—政府大厅—公司交税、申请补贴、养老保险 |
结构图 |
4.2.6 代理模式
目的 | 让其他对象可以用代理的方式控制访问本对象 |
---|---|
构成 | 抽象主题、代理、真实主题 |
特点 | 代理对象代表一个单一对象,且该模式客户端不能直接访问目标对象 外观对象则代表一个子系统,该模式用户可以访问系统中每个对象 |
举例 | 用户买票,12306代理访问车票内部数据库 |
结构图 |
4.2.7 享元模式
目的 | 利用共享技术,复制大量细粒度对象 |
---|---|
构成 | 抽象享元、具体享元、非享元、享元工厂 |
特点 | 解决程序使用中,大量创建相同或相似的对象、导致的资源开销问题 把相同的地方提取出来,使用享元模式 |
举例 | 五子棋围棋的黑白子、图像中的坐标点或颜色 |
结构图 |
4.2.3 行为型设计模式
描述对象的职责如何分配,处理对象间的交互
4.2.1 模版模式
目的 | 将算法一些步骤延迟在子类中实现,使得子类不改变数据结构的情况下,重新定义某些算法的特定步骤 |
---|---|
构成 | 抽象类、具体子类 |
特点 | 提供多个子类公有的方法到父类 不变的、复杂的、重要的方法,作为模板方法 |
举例 | 用户给出个性化要求,生产客制化产品 |
4.2.2 解释器模式
目的 | 依据语言或某一文法,来定义一个解释器,解释语言中的句子 |
---|---|
构成 | 客户端、环境、抽象表达式、终结符表达式、非终结符表达式 |
4.2.4 责任链模式⭐️
目的 | 多个对象处理某一请求,为避免冲突,将对象连成一条链,并沿着链传递请求,直到有一个对象处理它为止 |
---|---|
构成 | 客户、抽象处理者、具体处理者 |
特点 | 客户无需指定接收者,可向多个对象发送请求 |
举例 | 推卸责任模式,能处理处理,处理不了,next |
4.2.5 命令模式
目的 | 将一个请求封装为一个对象,发送请求和执行就变成了两个独立的操作 |
---|---|
构成 | 接收者—具体命令—抽象命令—调用者 |
举例 | 客人点菜不需要知道厨师姓名,服务员—接收菜单—给厨师执行—厨师做菜 |
4.3.6 迭代器模式
目的 | 提供一种顺序来访问一个聚合对象中的各个元素的方法,而不暴露聚合对象内部表示细节 |
---|---|
构成 | 抽象聚合、具体聚合、抽象迭代器、具体迭代器 |
特点 | 一种顺序访问、聚合对象、不暴露内部表示 |
4.2.7 中介者模式
目的 | 利用一个中介对象,减少对象间通信复杂性 |
---|---|
构成 | 抽象中介者、具体中介者、抽象同事类、具体同事类 |
特点 | 一组对象通信复杂、相互依赖 中介对象封装了其他对象间的通信 |
举例 | 房屋中介 一个后端数据模型能够被多个前端用户界面连接 |
4.2.8 备忘录模式
目的 | 不破坏封装的前提下,保存、捕获对象内部状态,以便可以恢复到该状态 |
---|---|
构成 | 发起人、备忘录、管理者 |
举例 | 备份、恢复到某一状态、数据库回滚、网页回退 |
4.2.9 观察者模式⭐️
目的 | 对象间的一对多依赖关系,当被依赖对象改变时,就会通知所有依赖它的对象 |
---|---|
构成 | 抽象事件、具体事件、抽象观察者、具体观察者 |
特点 | 具体事件知道其观察者 观察者和被观察者都有抽象,实现时,应该对扩展开放,对修改关闭 通过引入其他对象来分布通信 |
举例 | 发布—订阅模式、公众号订阅 |
4.2.10 状态模式⭐️
目的 | 当状态对象的内部状态发生改变时,对象可以根据条件相应的改变 |
---|---|
构成 | 环境、抽象状态、具体状态 |
特点 | 对象内部状态,允许不同状态下有不同行为 对对象单独封装成类 |
举例 | 自动贩卖机、操作系统多线程下的线程状态转换、不同情绪下人的表现 |
4.2.11 策略模式⭐️
目的 | 封装各个算法,不同算法可以相互替换,但不影响客户使用 |
---|---|
构成 | 抽象策略、具体策略、环境 |
特点 | 一个算法有不同的变体,许多相关类仅仅是行为有异 为多个只有行为差异的类, 配置不同行为 不希望客户知道算法的数据结构,分离算法的使用和的实现 |
例如 | 查询作者出版的不同类型的产物 |
4.2.12 访问者模式⭐️
目的 | 需要对一个对象结构中的对象进行很多不同且不相关的操作 |
---|---|
构成 | 抽象访问者、具体访问者、抽象元素、具体元素、对象结构 |
特点 | 同一对象,访问者不同,结果不同,操作不同 一个Visitor对象是一个多态的accept操作的参数 |
举例 | 超市商品系统:顾客关注价格和功能,老板关注利润和数量 小说人物,不同人不同评价 |