面向对象
面向对象 基础知识

面向对象=对象+分类+继承+消息通信;采用这4个概念开发的软件系统是面向对象的。
类分为3种:
1、实体类:表示现实中真实的实体
2、接口类(边界类):提供用户与系统交互的方式
3、控制类:控制活动流,充当协调者
存在一般和特殊关系:is-a关系,汽车与轮船都是交通工具
对象
现实世界中每个实体都是对象,如:电视
每个对象都有属性和操作,如:颜色,切换频道
通常包括:对象名、属性、方法
一个对象把属性和行为封装成一个整体 ,在设计者眼中它是程序模块
消息:对象之间的通信
封装
封装是一种信息隐蔽技术,它的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。
继承
继承是父类和子类之间共享数据和方法的机制。
一个子类可以继承它的父类(或祖先类)中的属性和方法,这些属性和操作在子类中不必定义,子类中还可以定义自己的属性和方法。
多重继承中可能导致子类存在二义性的成员
多态
不同的对象收到同一消息可以产生完全不同的结果,这现象称为多态
参数:方类似模板类,当方法需要操作的对象类型不确定时,可以使用多态来接受不同类型的对象,减少代码的重复。
包含:子类型化
过载:同一个名字在不同的上下文中所代表的含义不同。函数重载
强制:把操作对象的类型强行加以变换,int转double,即可是隐式的,也可显式转换。
静态绑定和动态绑定
静态绑定:在编译期间绑定
动态绑定:在运行期间绑定,支持继承和多态
面向对象 设计原则


面向对象 分析
OOA,目的是为了获得对应用问题的理解
包含5个活动
认定对象。
组织对象:分析对象间的关系,将相关对象抽象成类,其目的是为了简化关联对象,利用类的继承性建立具有继承性层次的类结构。
描述对象间的相互作用。
确定对象的操作。
定义对象的内部信息。
面向对象 设计
OOD,理解解决方案,实现系统的细节,定义系统构造蓝图
包含5个活动
识别类及对象
定义属性。
定义服务。
识别关系。
识别包。
面向对象测试
4个层次:
算法层:单元测试
类层:类中所有方法、属性之间的相互作用
模板层:一组协同工作的类之间的相互作用
系统层:各个子系统
面向对象程序设计
OOP:选一个面向对象的语言
UML
概念
UML 的词汇表包含 3 种构造块: 事物、关系和图;
事物是对模型中最具有代表性的成分的抽象;
关系是把事物结合在一起;
图聚集了相关的事物;
事物
UML 中有 4 种事物:结构事物、行为事物、分组事物和注释事物。
结构事物:静态部分

行为事物:动态部分

分组事物:组织部分
注释事物:解释部分

关系(重点)
1、只有出现一个对象消失时,另一个对象会怎么样才从组合或者聚合里考虑
2、类的方法中定义了另外一个类的对象,那是这个类依赖另一个类
3、一个类需要用到什么那就是依赖


实心菱形就是组合,空心就是聚合,然后菱形右边表示整体,左边表示部分


类实现接口

类图


对象图
注意与类图的区别

用例图

用例A包含用例B,用例A执行那用例B也会执行

B用例是A用例的扩展用例

直接理解为继承

交互图:分为序列图和通信图

通信图(协作图)有路径有顺序号
序列图和通信图是同构的,它们之间可以相互转换。

状态图




例如

活动图

构建图(组件图)
这里弄反了,圆是供,半圆是需。注意表示标识

部署图
部署图展现了系统的软件和硬件之间的关系,在实施阶段使用

UML图总结


设计模式

创建型设计模式 与对象的创建有关
工厂模式(Factory Method) 意图 :定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
当一个类希望由它的子类来指定它所创建的对象的时候
抽象工厂模式(Abstract Factory意图: 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
一个系统独立于它的产品时,多个产品由一个来配置
生成器模式(建造者模式)(Builder)意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
告诉Direcor要生产什么样的产品,Direcor负责调用方法,产品由具体生成器返回。
原型模式(Prototype)复制
**单例模式(Singleton)**保证一个类仅有一个实例,并提供一个访问它的全局访问点。
结构型设计模式 处理类或对象的组合
适配器模式(Adapter)意图: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
桥接模式(Bridge )意图: 将抽象部分与其实现部分分离 ,使它们都可以独立地变化 。
几何形状与颜色,在形状的具体类中,实例化时给颜色赋值
类的抽象和其实现之间不希望有一个固定的绑定关系
组合模式(Composite)意图: 将对象组合成树型结构 以表示**"部分-整体"的层次结构**。Composite使得用户对单个对象和组合对象的使用具有一致性。
装饰器模式(Decorator)意图: 动态地给一个对象添加一些额外的职责。就增加功能而言,Decorator模式比生成子类更加灵活。
外观模式(Facade)意图: 为子系统 中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
将一系列对象加以包装以简化其接口
享元模式(Flyweight)意图: 运用共亨技术有效地支持大量细粒度的对象。
因使用大量的对象 而造成很大的存储开销 时,进行对象共享,以减少对象数量从而达到较少的内存占用并提升性能。
代理模式(Proxy)意图: 为其他对象提供一种代理以控制对这个对象的访问。
在需要比较通用和复杂的对象指针代替简单的指针时
行为型设计模式 怎样交互和怎样分配职责
责任链模式(Chain of Responsibility)意图: 使多个对象都有机会处理请求 ,从而避免请求的发送者和接收者之间的耦合关系 。将这些对象连成一条链 ,并沿着这条链传递该请求,直到有一个对象处理它为止。
公司审批,一级一级的传递
有多个对象可以处理一个请求 ,在运行时刻自动确定由哪个对象处理
一个客户需要使用一组相关对象
想在不明确指定接收者 的情况下向多个对象中的一个提交一个请求
命令模式(Command)意图: 将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行 参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
点餐时,纸就是一个命令,纸可以随时查看,撤销,执行
在不同的时刻指定、排列和执行请求
**解释器模式(Interpreter)意图:**给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
有一个语言需要解释执行 ,并且可将句子表示为一个抽象语法树
迭代器模式(Iterator)意图: 提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示 。相当于一个list
中介者模式(终结者模式)(Mediator)意图: 用一个中介对象来封装一系列的对象交互 。中介者使各对象不需要显式地相互引用 ,从而使其耦合松散,而且可以独立地改变它们之间的交互。
可以理解为以前的电话转播,你先打电话给转播站,然后告诉它,你要跟谁通话,它帮你接通。
一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
减少多个对象或类之间的通信复杂性
备忘录模式(Memento)意图: 在不破坏封装性的前提下捕获一个对象的内部状态 ,并在对象之外保存这个状态 。这样以后就可以将对象恢复到原先保存的状态。
观察者模式(Observer)意图: 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变 时,所有依赖于它的对象都得到通知并被自动更新 。发布-订阅
状态模式(State)意图: 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
策略模式(Strategy)意图:定义一系列的算法 ,把它们一个个封装起来 ,并且使它们可以相互替换 。此模式使得算法可以独立于使用它们的客户而变化。
需要使用一个算法地不同变体
许多相关的类仅仅是行为有异
在设计某购物中心的收银软件系统时,要求能够支持在不同时期推出打折、返利、满减等不同促销活动
访问者模式(Visitor)意图: 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作。调用Accept进行访问(接收访问者)
需要对一个对象结构中的对象进行很多不同的并且不相关的操作
模板方法模式(Template Method)意图: 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。
**控制子类扩展。**模板方法旨在特定点调用"hook"操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。