设计模式

朝菌不知晦朔,蟪蛄不知春秋

设计是为了提高软件的性能和安全以及程序员更加容易维护和编写,设计模式不是单一的,是复杂灵活的,GOF//四人组

1. 设计原则

设计原则名称 定 义 使用频率
单一职责原则(Single Responsibility Principle, SRP) 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中 ★★★★☆
开闭原则(Open-Closed Principle, OCP) 软件实体应当对扩展开放,对修改关闭 ★★★★★
里氏代换原则(Liskov Substitution Principle, LSP) 所有引用基类的地方必须能透明地使用其子类的对象 ★★★★★
依赖倒转原则(Dependence Inversion Principle, DIP) 高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象 ★★★★★
接口隔离原则(Interface Segregation Principle, ISP) 客户端不应该依赖那些它不需要的接口 ★★☆☆☆
合成复用原则(Composite Reuse Principle, CRP) 优先使用对象组合,而不是继承来达到复用的目的 ★★★★☆
迪米特法则(Law of Demeter, LoD) 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位 ★★★☆☆

2. 创建型模式(记忆:工建原单,对对象的创建和使用)

  1. 简单工厂模式(Simple Factory)
  • 结构:工厂角色,抽象产品角色,具体产品角色
  • 类型:
  • 说明:把所有需要实例化的对象放入一个工厂里,由工厂进行实例化
  • 试用范围:没有太过于复杂的软件
  1. 工厂方法模式(Factory Method)
  • 结构:抽象产品,具体产品,抽象工厂,具体工厂
  • 类型:
  • 说明:相对应于一个产品等级结构,也就是同一类型的对象和类,在简单工厂下再造具体工厂,负责一个品牌的同一类型
  • 试用范围:比较广泛
  1. 抽象工厂模式(Abstract Factory)
  • 结构:抽象工厂,具体工厂,抽象产品,具体产品
  • 类型:
  • 说明:相对应于一个产品族,也就是一个品牌的所有类和对象
  • 试用范围:对于一个产品族
  1. 建造者模式(Builder)
  • 结构:抽象建造者,具体建造者,产品角色,指挥者
  • 类型:
  • 说明:有复杂的内部结构,组成结构类似
  • 试用范围:
  1. 原型模式(Prototype)
  • 结构:抽象原型,具体原型,客户类
  • 类型:深克隆(Serializable)浅克隆(Cloneable)
  • 说明:可以通过一个已有对象复制获取更多的对象
  • 试用范围:不是单例的情况
  1. 单例模式(Singleton)
  • 结构:instance
  • 类型:懒汉型+延迟加载+锁、饿汉型、静态内部类、枚举
  • 说明:Singleton只有一个实例
  • 试用范围:

3. 结构型模式(记忆:ABCDFFP,对现有系统进行补救以及对现有类进行重用,类与对象,类的结构,对象与类,对象的结构)

  1. 适配器模式(Adapter)
  • 结构:目标抽象类,适配器类,适配者类,客户类

  • 类型:类适配器,对象适配器,缺省适配器(默认适配器),双向适配器

  • 说明:将一个接口转换为客户希望的另一个接口,或其他跨平台操作

  • 试用范围:有很多第三方接口

  1. 桥接模式(柄体模式,接口模式,Bridge)
  • 结构:抽象类(不是接口),扩充抽象类,实现类接口,具体实现类
  • 类型:
  • 说明:将抽象和实现部分分离,使它们可以独立的变化
  • 试用范围:两个独立变化的维度,例如彩笔,有彩笔类和颜色,把颜色定为类,彩笔也定为类
  1. 组合模式(Composite,树形结构,部分-整体)
  • 结构:抽象构件,叶子构件,容器构件,客户类

  • 类型:透明组合模式,安全组合模式(一般用)

  • 说明:树形结构

  • 试用范围:客户能够忽略不同对象层次的变化

  1. 装饰模式(Decorator,替代继承,用来更加好看)
  • 结构:抽象构件,具体构件,抽象装饰类,具体装饰类

  • 类型:透明修饰(很少有),半透明修饰(一般)

  • 说明:比继承更加灵活

  • 试用范围:final定义的类想要继承,密码修饰,其他IO

  1. 外观模式(Facade)
  • 结构:外观角色,子系统模式

  • 类型:

  • 说明:通过外观类提供子接口

  • 试用范围:C/S客户端菜单或者工具栏,B/S首页和导航栏,

  1. 享元模式(Flyweight,节约内存空间)
  • 结构:抽象享元类,具体享元类,非共享具体享元类,享元工厂类
  • 类型:
  • 说明:
  • 试用范围:存在大量相同或者相似的对象
  1. 代理模式(Proxy)
  • 结构:抽象主题角色,代理主题角色,真实主题角色
  • 类型:远程代理,虚拟代理,保护代理,动态代理,缓冲带你,防火墙代理,同步化代理,智能引用代理
  • 说明:
  • 试用范围:不能直接访问对象或者其他类

4. 行为型模式(对象之间的交互,中间,类行为型模式,对象行为型模式)

  1. 职责链模式(Chain of Responsibility)
  • 结构:抽象处理者,具体处理者,客户类
  • 类型:
  • 说明:从上到下,可能是直线,也可能是一个环,树形结构,
  • 试用范围:try catch语句
  1. 命令模式(Command,动作模式,事务模式)
  • 结构:抽象命令类,具体命令类,调用者,接收者,客户类
  • 类型:
  • 说明:本质是对命令进行封装
  • 试用范围:支持命令的撤销(Undo)和恢复(Redo)操作,命令队列和宏(组合)命令
  1. 解释器模式(Interpreter,设计一种新的语言)
  • 结构:抽象表达式,终结符表达式,非终结符表达式,环境类,客户类
  • 类型:
  • 说明:文法规则::: = 定义为,| 或,{}组合,* 0至多次,抽象语法树(AST)
  • 试用范围:简单文法规则
  1. 迭代器模式(Iterator,游标)
  • 结构:抽象迭代器,具体迭代器,抽象聚合类,具体聚合类
  • 类型:Object next() Boolean hasNext() void remove()互相关联next()
  • 说明:
  • 试用范围:对一个聚合对象进行遍历,可以是List也可以是Set

5.中介者模式(Mediator)

  • 结构:抽象中介者,具体中介者,抽象同事类,具体同事类
  • 类型:
  • 说明:结构性(中转作用)行为性(协调作用)
  • 试用范围:MVC
  1. 备忘录模式(Memento)
  • 结构:原发器,备忘录,负责人
  • 类型:
  • 说明:要注意封装
  • 试用范围:撤销和恢复,后悔想要修改,数据库,
  1. 观察者模式(Observer)
  • 结构:目标类(可以是抽象,也可以是实现类),具体目标类(可以很多类),观察者,具体观察者
  • 类型:
  • 说明:Java.util包提供了Observable类以及Observer接口
  • 试用范围:有两个方面,一个依赖另一个方面,MVC
  1. 状态模式(State)
  • 结构:环境类,抽象状态类,具体状态类
  • 类型:
  • 说明:
  • 试用范围:解决系统中复杂对象的状态转换以及不同行为状态下行为的封装问题
  1. 策略模式(Strategy,封装算法)
  • 结构:环境类,抽象策略类,具体策略类
  • 类型:
  • 说明:区别于硬编码
  • 试用范围:用于算法的自由切换和扩展
  1. 模板方法模式(Template Method)
  • 结构:抽象类,具体子类
  • 类型:
  • 说明:在抽象父类中提供一个称之为模板方法的方法来定义这些方法的执行次序,基本方法(钩子方法,抽象方法,具体方法)+模板方法
  • 试用范围:框架(spring,struct)
  1. 访问者模式(Visitor)
  • 结构:抽象访问者,具体访问者,抽象元素,具体元素,对象结构(List,Set)
  • 类型:
  • 说明:与其他模式联用
  • 试用范围:变量

5. 一句话总结设计模式

分类 设计模式 简述 一句话归纳 目的 生活案例
创建型设计模式
(简单来说就是用来创建对象的)
工厂模式(Factory Pattern) 不同条件下创建不同实例 产品标准化,生产更高效 封装创建细节 实体工厂
单例模式(Singleton Pattern) 保证一个类仅有一个实例,并且提供一个全局访问点 世上只有一个我 保证独一无二 CEO
原型模式(Prototype Pattern) 通过拷贝原型创建新的对象 拔一根猴毛,吹出千万个 高效创建对象 克隆
建造者模式(Builder Pattern) 用来创建复杂的复合对象 高配中配和低配,想选哪配就哪配 开放个性配置步骤 选配
结构型设计模式
(关注类和对象的组合)
代理模式(Proxy Pattern) 为其他对象提供一种代理以控制对这个对象的访问 没有资源没时间,得找别人来帮忙 增强职责 媒婆
外观模式(Facade Pattern) 对外提供一个统一的接口用来访问子系统 打开一扇门,通向全世界 统一访问入口 前台
装饰器模式(Decorator Pattern) 为对象添加新功能 他大舅他二舅都是他舅 灵活扩展、同宗同源 煎饼
享元模式(Flyweight Pattern) 使用对象池来减少重复对象的创建 优化资源配置,减少重复浪费 共享资源池 全国社保联网
组合模式(Composite Pattern) 将整体与局部(树形结构)进行递归组合,让客户端能够以一种的方式对其进行处理 人在一起叫团伙,心在一起叫团队 统一整体和个体 组织架构树
适配器模式(Adapter Pattern) 将原来不兼容的两个类融合在一起 万能充电器 兼容转换 电源适配
桥接模式(Bridge Pattern) 将两个能够独立变化的部分分离开来 约定优于配置 不允许用继承
行为型设计模式
(关注对象之间的通信)
模板模式(Template Pattern) 定义一套流程模板,根据需要实现模板中的操作 流程全部标准化,需要微调请覆盖 逻辑复用 把大象装进冰箱
策略模式(Strategy Pattern) 封装不同的算法,算法之间能互相替换 条条大道通罗马,具体哪条你来定 把选择权交给用户 选择支付方式
责任链模式(Chain of Responsibility Pattern) 拦截的类都实现统一接口,每个接收者都包含对下一个接收者的引用。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 各人自扫门前雪,莫管他们瓦上霜 解耦处理逻辑 踢皮球
迭代器模式(Iterator Pattern) 提供一种方法顺序访问一个聚合对象中的各个元素 流水线上坐一天,每个包裹扫一遍 统一对集合的访问方式 逐个检票进站
命令模式(Command Pattern) 将请求封装成命令,并记录下来,能够撤销与重做 运筹帷幄之中,决胜千里之外 解耦请求和处理 遥控器
状态模式(State Pattern) 根据不同的状态做出不同的行为 状态驱动行为,行为决定状态 绑定状态和行为 订单状态跟踪
备忘录模式(Memento Pattern) 保存对象的状态,在需要时进行恢复 失足不成千古恨,想重来时就重来 备份、后悔机制 草稿箱
中介者模式(Mediator Pattern) 将对象之间的通信关联关系封装到一个中介类中单独处理,从而使其耦合松散 联系方式我给你,怎么搞定我不管 统一管理网状资源 朋友圈
解释器模式(Interpreter Pattern) 给定一个语言,定义它的语法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子 我想说”方言“,一切解释权都归我 实现特定语法解析 摩斯密码
观察者模式(Observer Pattern) 状态发生改变时通知观察者,一对多的关系 到点就通知我 解耦观察者与被观察者 闹钟
访问者模式(Visitor Pattern) 稳定数据结构,定义新的操作行为 横看成岭侧成峰,远近高低各不同 解耦数据结构和数据操作 KPI考核
  委派模式(Delegate Pattern) 允许对象组合实现与继承相同的代码重用,负责任务的调用和分配 这个需求很简单,怎么实现我不管 只对结果负责 授权委托书

6. 总结

设计模式对自己的编程的思想和规范有了很好的引导,以及对软件完成后性能和安全的思考加深,如果有一些错误和建议,欢迎评论区指出。