以下是本人学习的观点,如果有错或者说得不全面,记得告诉我哟
23种经典设计模式UML类图汇总 https://shixin.blog.csdn.net/article/details/45381071
创建型:单例模式 简单工厂模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式
结构型:代理模式 适配器模式 装饰器模式 桥接模式 组合模式 享元模式 外观模式
行为型: 观察者模式 模板方法模式 命令模式 状态模式 职责链模式 解释器模式 中介者模式 访问者模式 策略模式 备忘录模式 迭代器模式
开闭原则
定义:一个软件实体如类、模块函数应该对扩展开放,对修改关闭。强调的是用抽象构建框架,用实现扩展细节。以提高软件系统的可复用性及可维护性帮助我们实现稳定灵活的系统架构。生活中的实例(弹性工作制,每天必须工作满八小时这个是不能修改的,但是对于什么时候来什么时候走没有规定)。实现开闭原则的核心思想是面向抽象编程。
依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖抽象。针对接口编程,不要针对实现编程。通过抽象包括使用接口或者抽象类,可以使个各类或者模块的实现彼此独立,互不影响,从而实现模块间的耦合性。简单来说就是程序应该依赖于接口而不是实现类。
单一职责原则
定义:不要存在多于一个导致类变更的原因。例如某个类有了两个方法,每个方法负责一个职能,假如方法一的职责需要发生变化,那么就需要修改这个类文件,这种改变就可能导致原本运行正常的方法二发生故障。对于这种两个职责经常发生变化的方法,需要分别建立相应的 java 文件分别负责相应的职能,避免一方暂时改变另一方不变的情况下,相互影响。通常情况下我们对类单一职责要求较低,但是接口和方法尽量是保证单一职责。根据你的业务要求所写的类或者接口方法最好能满足需求即可,不需要对其进行可能会用到的扩展,如果真的有,那就再写一个方法、类、接口。
里氏替换法则
定义扩展:一个软件实体如果适用一个父类的话,那么一定适用于其子类,所有引用父类的地方必须能透明的使用其子类的对象,子类对象能够替换父类对象,而程序逻辑不变。
迪米特法则
定义:一个对象应该对其他对象保持最少的了解,又叫最少知道原则。尽量降低类与类之间的耦合。高内聚低耦合的体现。
合成(组合)/聚合复用法则
定义:尽量使用对象组合/聚合,而不是继承关系达到软件复用的目的。
接口隔离原则
定义:用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。一个类对一个类的依赖应该建立在最小的接口上。建立单一的接口,不要建立庞大臃肿的接口。尽量细化接口,接口中的方法尽量少。注意适度原则。
单例模式
常用场景:应用中有对象需要是全局的且唯一
选择的原因:一个对象在应用中出现多个实例可能会引起逻辑上或者程序上的错误
相关设计模式
原型模式:单例模式只有一个实例,原型模式每次拷贝都会创造一个新的实例。
简单工厂模式
遵循单一职责,违背开闭原则
常用场景:需要在一堆产品中选择其中一个产品
可变:产品的种类
选择的原因:一中产品能否根据某个参数决定它的种类。
相关设计模式:
工厂方法模式:是简单工厂模式的进一步抽象,如果工厂的作用仅仅是用来制造产品,就没有必要使用工厂方法模式。
工厂方法模式
遵循单一职责,依赖倒置,开闭原则
常用场景:希望工厂和产品的种类对客户端保持透明,给客户提供一样的服务或者不同工厂提供不同的服务。
可变:工厂和产品的种类
选择的原因:工厂和产品是否生命周期一样。
相关设计模式
抽象工厂模式:在工厂方法模式中,工厂创造的是一个产品,而在抽象工厂模式中,工厂创造的是一个产品组。
抽象工厂模式
遵循单一职责,依赖倒置,开闭原则
常用场景:需要一个接口可以提供一个产品组,不必知道产品的具体种类
可变:工厂和产品的种类
选择的原因:产品组需要一起提供,要有一致的接口
相关设计模式
建造者模式:两者都是建造一批产品对象,抽象工厂模式中,为了提供一个这批对象的接口而定义一个抽象工厂接口;建造者模式是为了复用对象的构建过程而定义了一个指挥者。
建造者模式
遵循单一职责,开闭原则
常用场景:需要构建一批构建过程相同但是产品不同
可变:产品的表示
选择的原因:每个产品的构建过程相同
原型模式
常用场景:需要在运行时候动态创建指定实例种类的对象,或者想要复用其原型状态
选择的原因:创建出来的对象可以立即投入使用
代理模式
功能复用
常用场景:需要修改或者屏蔽某个类的部分功能,复用另外一部分功能,使用静态代理;若是在方法前后插入一些一致的操作,这些类有一直的接口可以使用JDK的动态代理。使用cglib的话没有接口。
可变:静态代理没有变化,动态代理的变化为具有相同切入点的类。
选择的原因:静态代理要复用被代理的部分功能,动态代理在被代理的这一批类中,找出相同的切入点。
相关设计模式
适配器模式:适配器模式中定制适配器,与静态代理都有复用功能的作用,不同的是,静态代理会修改一部分原有功能,而适配器往往是全部复用,而且在复用的同时,适配器还会将复用的类适配一个接口。
适配器模式
遵循开闭原则,体现功能复用
常用场景:需要一个类的功能,但是该类的接口不符合要求的接口,使用定制的适配器,这样适配器相当于兼用接口的一个方法。
相关设计模式
装饰者模式:适配器模式的目的在于适配接口,装饰者模式在于动态添加功能。
装饰者模式
迪米特,单一职责,开闭原则,不符合里氏替换,体现功能复用
常用场景:一个类需要动态的添加功能,并且这些功能是可以相互叠加。
可变:动态添加的功能(装饰器)
选择的原因:添加的功能需要动态组装
桥接模式
遵循单一职责,迪米特,开闭原则,体现功能复用
常用场景:一个对象有多个维度的变化,需要将这些维度抽离出来,让其独立变化。
可变:维度的扩展与增加
选择的原因:可以将对象拆分成多个不相关的维度
组合模式
依赖倒置,开闭原则,破坏接口隔离
常用场景:当有一个接口可以组合成树形接口,同时向客户端提供一致的操作接口
可变:节点的数量
选择的原因:对外提供一致操作接口的结构可转化为树形结构
享元模式
常用场景:一些状态相同的对象被大量的重复使用
选择的原因:被共享的对象可以将外部状态提取出来
外观模式
迪米特
常用场景:一个子系统需要对外提供服务
选择的原因:子系统对外提供服务需要依赖很多的类
相关设计模式
中介者模式:两者都是为了处理复杂的耦合关系,不同的是外观模式处理的是类之间复杂的依赖关系,中介者模式处理的是对象之间复杂的交互关系。
观察者模式
迪米特,开闭原则
常用场景:需要将观察者与被观察者解耦或者是观察者的种类不确定
可变:观察者的种类和个数
选择的原因:观察者与被观察者是多对一的关系
模板方法模式
破坏里氏替换,体现功能复用
常用场景:一批子类的功能有可提取的公共算法架构
可变:算法架构内各个步骤的具体实现
选择原因:算法架构牢固
命令模式
迪米特,开闭原则
常用场景:行为的请求者与行为的处理者耦合度过高
可变:命令的种类
选择原因:请求者不需要关心命令的执行只知道接收者
相关设计模式
职责链模式:两者都是为了处理请求或者命令而存在的,两者都是为了将请求者与响应者解耦。不同的是命令模式中,客户端需要知道一个命令的接收者,在创建命令的时候就把接受和命令绑定在一起发送给调用者,而职责链模式中,并不关心最终处理请求的对象是谁,客户端只是封装一个请求对象,随后交给职责链的头部。
状态模式
单一职责,依赖倒置,开闭原则
常用场景:一个对象在多个状态下行为不同,而且这些状态可相互转换。
可变:状态的种类
选择的原因:这些状态经常咋i运行时需要在不同的动态宅男相互转换
相关设计模式
策略模式:状态模式经常会在处理请求的过程中更改上下文的状态,策略模式只是按照不同的算法处理算法逻辑,从实际场景来讲,状态模式改变的是状态,策略模式改变的是策略。
职责链模式
迪米特
常用场景:一个请求的处理需要多个对象当中的一个或几个协作处理
可变:处理链的长度和次序
选择的原因:对于每一次请求的每个处理的对象都需要一次处理机会
解释器模式
单一职责
常用场景:有一种语言被频繁的使用
可变:语言的规则
选择的原因:被频繁使用的语言可用文法(文章的书写法规,一般用来指以文字、词语、短句、句子的编排而组成的完整语句和文章的合理性组织)表示
中介者模式
迪米特,破坏的单一职责
常用场景:一个系列的对象交互关系十分复杂
可变:对象之间的交互
选择的原因:复杂的交互关系有共性可被中介者承担
访问者模式
遵循倾斜的开闭原则
常用场景:作用于一个数据结构之上的操作经常变化
可变:数据结构之上的操作
选择的原因:数据结构稳定以及操作经常变化
策略模式
单一职责,依赖倒置,迪米特,开闭原则
常用场景:算法或者策略需要经常替换
可变:策略的种类
选择关键点:客户端依赖某一个或若干个具体的策略
备忘录模式
迪米特,开闭原则
常用场景:需要在对象的外部保存该对象的内部状态
选择的原因:可以在必要的时候捕捉对象的内部状态
迭代器模式
迪米特
常用场景:需要迭代访问一个聚合对象中的每个元素,同时不暴露该聚合对象内部的信息
可变:聚合对象的种类
选择的原因:客户端关心遍历的次序
相关设计模式
访问者模式:两者都是迭代元素。访问者扩展开放的部分在作用于对象的操作上,而迭代器扩展开放的部分在聚合对象的种类