一、设计模式
1、创建型
抽象工厂:提供一个接口,创建一系列的相关相互依赖的对象,无需指定具体的类;
eg:系统软件,支持多种数据库
生成器:将一个复杂类的表示与构造相分离,使得相同的构建过程能够得到不同表示;
eg:同样制作方法,不同种类披萨
工厂方法:定义一个创建对象的接口,但由子类决定需要实例化哪一个类;
eg:产品选择用哪个子类产品
原型Prototype:用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象;
eg:自动生成求职简历,工作经验不同(clone)
单例:保证一个类只有一个实例,并且提供一个访问他的全局访问点、、、1855
2、结构型设计模式
适配器:将一个类的接口转换成用户希望得到的另一种接口。使得原本不兼容的接口得以协同工作;eg:USB,Type-c,语言适配?
桥接:将类的抽象部分和它的实现部分分离,使得可以独立变化; 继承树拆分
eg:不同Linux,win系统显示不同后缀图片gif,bmp,jpeg
组合(composite):将对象组合成树型结构以表示“整体-部分”层次结构,使用户对单个对象和组合对象的使用具有一致性。
eg:公司,子公司;文件夹,文件,菜单?
装饰器:动态给一个对象添加一些额外职责,子类扩展功能;
eg:operation,super.print()调用父类方法,super(t)表示父类的,发票头尾
person lisi = new Decorator(new A(new student("lisi")))
外观(Facade):定义一个高层接口,为子系统中的一组接口提供一个一致的外观,简化该系统的使用;eg:对外统一接口
享元(Flyweight):提供支持大量细粒度对象共享的有效方法;
eg:黑子,白子,位置
代理:为其他对象提供一种代理以控制这个对象的访问;
3、行为型设计模式
责任链:多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责。
命令:将一个请求封装为一个对象,从而使得可以用不同的请求进行参数化,对请求排队或者记录请求日志以及支持可撤销的操作。
eg:遥控器开关机,开关灯;
解释器:有一个语言需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式
迭代器:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。常用于遍历一个集合对象
中介者:中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。
eg:支付接口
备忘录:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。多用于数据备份和恢复的场景。
观察者:对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知
eg:关注up,关注某个事情
状态:当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时就可以考虑状态模式
eg:自动贩卖机,会员等级调整。
策略:策略模式会定义一系列算法,从概念上来看,所有这些算法完全的都是相同的工作,相互替换,只是实现不同,它可以以相同的方式调用所有的算法,
eg:飞机模拟飞行。购物中心打折,满减,原价
模板方法:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算的结构即使重定义该算法的某些特定步骤。
访问者:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
eg:统计馆藏文献页数?
二、数据结构----图
1、邻接矩阵:n*n
有向图: 行:出度,列:入度;
无向图:对称,第 i 行非0元素个数为顶点 i 的度;
稠密图:O(n2)
2、邻接表:
有向图:空间:n+e,
无向图:n+2e,
稀疏图
3、十字链表:有向图,易
4、广度优先:
队列,不唯一,BFS,层序遍历
空间复杂度:O(n),时间复杂度:O(e);
5、深度优先:
栈,不唯一,BFS,先序遍历
空间复杂度:O(n),时间复杂度:O(e);
6、最小生成树
带权连通无向图
(1)prim:O(v2)边稠密;从顶点开始,找集合边最小;
(2)(贪心算法)kruskal:不断选择未被选的最小权值边,O(eloge),边稀疏;
7、最短路径:
(1)(贪心算法)Dijkstra:某一顶点到其他顶点的最短路径(单源),O(v2);
(2)(动态规划)Floyed:适用所有顶点间最短路径和带权无向图,
时间复杂度:O(v3)空间复杂度:O(n2)
拓扑排序:AOV网,关键路径--AOE网
二、数据结构----排序
1、查找
顺序查找:ASL=(n+1)/2
二分查找:ASL=O(logn)
2、排序
归并排序:动态规划
不稳定:快些选堆 朋友来
时间快(nlogn):快些归队
一趟确定一个位置:快,选,堆,冒(帽子)
再就是:
正规式:有限自动机的另外一种表达形式
|:表示或
()*:表示循环多次,*可以是0到无穷
计算机网络
dhcp分到的ip是169和0,说明有问题,是错误的
DHCP动态分配ip时候:若没有获取到,Windows是169.254.0.0,linux是0.0.0.0
DHCP客户端可以从DHCP服务端获得本机IP地址、DNS服务器地址、DHCP服务器地址、默认网关的地址(没有web服务器地址和邮件服务器地址)
软件工程:
瀑布模型
每个阶段末尾都会有评审,评审上一阶段的工作是否达标
缺点:初期分析需求无法把控,开发末期的结果和客户要求不一致,全盘推翻==(不能适应变化的需求)==
适用场景:需求明确/二次开发/有过经验,用新技术重构也用瀑布
原型:
定义在需求不明确的情况,初期构建一个简易系统让用户发现问题,探索用户的需求==(只应用于需求分析阶段)==,也可以探索出特殊的软件解决方案
能够迅速开发出一个让用户看得见的系统框架,可以用来支持用户界面设计
不能指导代码优化
原型模型最不适合大规模软件开发
增量:
先做出核心,好处在核心模块尽早和用户接触了==(逐步理解需求)==,但是这种模式如何进行模块划分是难点
演化(迭代)模型:
相比原型,适用于需求清楚,尽早投入使用,要不断改善的时候
螺旋模型
将开发活动和风险管理结合起来,求将风险降到最小并控制风险
有多个模型的特点:瀑布+快速原型
包含维护周期,所以开发和维护之间没有本质区别
喷泉模型与RAD
面向对象
用户需求为动力,对象作为驱动,客服了瀑布模型不支持软件重用和多项开发活动集成的局限性
迭代、无间隙(开发活动之间不存在明显边界)
RAD:快速开发模型,SDLC(瀑布模型)+CBSD(构件化开发模型);可以快速构建应用系统
统一过程UP
也称RUP,用例和风险为驱动,以架构为中心,迭代并增量开发
用于大型项目
五个阶段:起始、精化、构建、移交、产生
敏捷开发方法
给开发减轻负担、适合小型项目、随时对接客户
自适应方法ASD==(6个基本原则)、水晶方法Crystal(每个项目用不同方法)、特征驱动开发、并列争球法SCRUM(30天一迭代的冲刺,按需求优先级实现)、极限编程XP(激发创造性、管理负担小,测试先行)
内聚是一个模块内部各个元素彼此结合的紧密程度
巧合内聚(偶然内聚):两个程序块放在一起,但是没有任何关系
逻辑内聚:两个放在一起的程序块有逻辑上的关系(比如根据参数选择调用哪个程序块)
时间内聚:需要同时执行的几个任务放在一起
过程内聚:放在一起的程序块处理的元素是相关的,并且按一定次序
通信内聚(信息内聚):模块内处理的对象都是同一个数据结构
顺序内聚:放在一起的程序块处理的元素是相关的,并且顺序执行
功能内聚:模块内所有元素完成单一功能(不可再分,缺一不可)
耦合是模块之间相互独立性的度量,连接越紧密,耦合性越高,独立性越弱
数据耦合:两个模块之间通过简单数据交换信息
标记耦合:两个模块通过数据结构传递
公共耦合:访问同一个公共的数据环境