1. GRASP设计模式(原则)
(1). 信息专家
责任(方法)分配给拥有资源的对象.
例如,String类的eques()方法就属于String对象本身
(2). 创建者
当一个类A拥有另一个类B的初始化数据,或者拥有这个类或者频繁使用等条件成立时,类B可以由类A创建.
工厂,迭代器的创建等等
(3). 低耦合
尽量减少类之间的关联性,这样做可以减少修改软件是的工作量,使代码容易理解
但也不可绝对的低耦合
(4). 高内聚
紧密相关的功能分配给同一个类.
关于数学计算的类全部给Math类
(5). 控制器
能全面代表系统或者子系统的类,成为控制器类.
MVC中的controller包含了某一个子系统(模块)的所有职能
(6). 多态
行为随着类型变化,而不是if-else
面向对象三大特征之一
(7). 纯虚构
把非问题域中的职责分配给特定的类
util
(8). 中介
用第三方类来负责两个类中的复杂关联,避免耦合和破坏内聚
代理应该算一种
(9). 变化预防
将一些变化提前预知,设计容错的接口(如使用多态来防止类型的变化)
2. GoF设计模式
(1). 创建型模式
对类的实例化过程进行抽象,使软件中对象的使用和创建分离
只需要关注如何使用对象,对象的创建由其他类负责
1). 简单工厂模式
根据传入参数返回不同对象(被创建的对象通常有共同父类,通过多态实现传参)
2). 工厂方法模式
工厂父类提供接口,工厂子类负责具体实现,可拓展的简单工厂.
这样不需要更改原来的代码,只新增就可以进行拓展
3). 抽象工厂模式
抽象工厂
text有两种分别为textA, textB,有公共父类text
button有两种分别为buttonA, buttonB,有公共父类button
这样A和B就是两个产品族,
那么可以使用FA生产A产品族的产品,FB生产B族的产品
工厂,text和button都是抽象类,FA,FB,textA,textB,buttonA,buttonB都是具体实现类
4). 单例模式
确保某一个类只有一个实例对象,为其提供全局访问的权限,且必须自行创建
构造私有化,get方法内判断单例是否已存在
(2). 结构型模式
1). 适配器模式
两个类的消息不兼容(接口不一致),在中间增加一个适配器提供消息的转化,使之兼容(转化为合适的接口,内部重新调用)
2). 桥接模式
继承关系只能单维度的拓展,将集成转为聚合,那么可以聚合多个类,就可以实现多维度的拓展(设置不同的该变量)
3). 组合模式
类似于树的定义,TreeNode节点既可以是容器(双亲节点是孩子节点的容器),也可以是单个的叶子.实现递归组合
4). 装饰模式
在一个对象中关联另一个对象,对其内部数据或方法进行内部调用,同时增加额外的职能.
与代理非常像,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。
5). 外观模式
系统外部与系统进行通信只需要和一个外观进行通信即可,系统内部连同外观是高内聚的,与外界是低耦合的
dao层对数据库中一张表的通信封装在一个mapper接口的实现类中,外部不需要知道如何和数据库通信.
6). 代理模式
重心是为了借用对象的功能完成某一流程,而非对象功能如何。
(3). 行为型模式
在不同的对象之间划分责任和算法
1). 观察者模式
建立对象之间的一对多依赖关系,主题对象改变后,一个观察者发现了会通知其他观察者对象
2). 迭代器模式
让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构。
3). 命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持撤销的操作。
4). 策略模式
指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
5). 状态模式
当一个对象的内在状态改变时允许改变其行为
6). 模板方法模式
模板方法是定义在抽象类中将方法的大致步骤抽象出来,由子类按照各自逻辑进行细化.