前言
《Design Patterns: Elements of Reusable Object-Oriented Software》设计模式,是四个作者Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides "四人组(Gang of Four)"的著作,我们一般讲到的Gof 设计模式就是说的这本书所描述的23种设计模式
到这篇总结,已经完成了23种设计模式的系统的学习
在这次设计模式的学习中,我没有学习到高深的知识,更多的是学习到了一种思想:让代码更优雅的思想
UML
设计模式面向对象设计思想,在Java知识体系中是Java基础知识和J2EE框架知识之间一座隐性的"桥"
J2EE是企业级开发的工业标准,既然是工业、工程,即必须有统一的描述语言
统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言
在企业级开发中,写文档、描述产品,一定会使用到UML
设计模式(1)UML详解
设计模式原则
Gof23种设计模式,但是,它们都是根据七大原则,在不同方面的扩展
这七大原则是:
- 开闭原则:软件应该面向扩展开放,面向修改关闭
- 里氏替换原则:子类可以扩展父类的功能,但不能改变父类的功能
- 依赖倒置原则:细节应当依赖抽象,即面向接口编程,接口、抽象类定义类规范,具体由子类实现
- 单一职责原则:一个类应当有且只承担一个职责,控制类的粒度大小
- 接口隔离原则:一个接口(抽象类)应当只包含客户需要的方法,类与类的依赖应该建立在最小的接口上
- 迪米特法则:实体类间如果不需直接通信,就不应该发生直接的相互调用,而是通过第三方转发调用
- 合成复用原则:软件复用时,应该先考虑聚合、组合复用,再考虑继承关系
七大原则有些抽象,但是在后续的23中设计模式中,或多或少的使用了这些原则,结合实际思考,会有更深的体会
创建型模式
创建型模式关注的是“怎样去创建对象”,主要特点是将对象的创建与使用分离
创建型模式有5种(简单工厂方法不在其中):
- 简单工厂模式:根据不同的参数返回不同的实例,用户只需知道参数名代表的实例
设计模式(3)创建型模式 - 简单工厂模式 - 工厂方法模式:工厂父类中定义创建产品的公共接口,工厂子类负责创建具体的产品(针对一个系列的产品,是简单工厂模式的扩展)
设计模式(4)创建型模式 -工厂方法模式 - 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类(针对产品族,是工厂方法模式的扩展)
设计模式(5)创建型模式 - 抽象工厂模式 - 单例模式:确保一个类只有一个实例,并自行实例化向系统提供该实例
设计模式(6)创建型模式 - 单例模式 - 原型模式:通过复制原型对象创建新的对象(设计Java克隆)
设计模式(7)创建型模式 - 原型模式 - 建造者模式:将复杂的创建与表现隔离,即一步步创建复杂对象的组件,最终拼接成复杂对象
设计模式(8)创建型模式 - 建造者模式
创建型模式5个加上一个简单工厂模式,总体比较简单,主要关注的是对象的创建
结构型模式
结构型模式描述的是如何将对象 根据某种布局 组成 更大或者适用环境的结构
结构型模式有7种:
-
适配器模式:通过适配器类将客户无法使用的类转化成客户需要的类
设计模式(9)结构型模式 - 适配器模式 -
桥接模式:通过架起一个“桥梁”,将对象的多个维度的变化通过聚合的方式结合成需要的结构
设计模式(10)结构型模式 - 桥接模式 -
装饰模式:往修饰者中聚合被修饰者,动态的为修饰者添加功能
设计模式(11)结构型模式 - 装饰模式 -
组合模式:以递归的思想,组合多个对象形成树型结构,表现“整体-部分”的关系
设计模式(12)结构型模式 - 组合模式 -
外观模式:设计一个外观角色将子系统的功能集中,客户只需使用外观角色即可完成复杂的子系统功能
设计模式(13)结构型模式 - 外观模式 -
享元模式:享元工厂维护一个享元池,用户可共享享元池中的共享角色
设计模式(14)结构型模式 - 享元模式 -
代理模式:给对象提供一个代理类,用户通过代理类即可控制该对象
设计模式(15)结构型模式 - 代理模式:静态、动态代理、Cglib代理
行为型模式
行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用,在不同的对象之间划分责任和算法的抽象化
行为型模式有11种:
- 模板方法模式:定义一个算法的骨架,特定步骤延迟到子类实现
设计模式(16)行为型模式 - 模板方法模式 - 命令模式:将命令封装成对象,聚合执行者,命令请求者调用命令对象即可完成命令操作
设计模式(17)行为型模式 - 命令模式 - 访问者模式:封装施加于对象结构的元素上的操作,使我们可以在不改变对象结构的前提下定义作用与元素上的操作
设计模式(18)行为型模式 - 访问者模式 - 迭代器模式:将聚合对象的存储功能和遍历功能分隔,遍历功能封装成迭代器,聚合对象工厂方法创建对应的迭代器
设计模式(19)行为型模式 - 迭代器模式 - 观察者模式:定义对象间的一对多的依赖关系,当对象改变时,自动通知所有依赖的对象并自动更新对象数据
设计模式(20)行为型模式 - 观察者模式 - 中介者模式:定义一个中介者封装对象间的交互关系,使对象间没有显示引用,对象通过中介者间接访问其他对象
设计模式(21)行为型模式 - 中介者模式 - 备忘录模式:定义一个备忘录角色存储对象的内部状态,提供给对象恢复状态的功能
设计模式(22)行为型模式 - 备忘录模式 - 解释器模式:给分析对象定义一个语言并设置文法表示,创建一个解释器解释语言的语句(设计编译原理知识)
设计模式(23)行为型模式 - 解释器模式 - 状态模式:允许对象在其内部状态改变时改变它的行为
设计模式(24)行为型模式 - 状态模式 - 策略模式:将各种算法封装,让用户自行决定使用哪种策略
设计模式(25)行为型模式 - 策略模式 - 职责链模式:将可能执行请求的处理对象组成一个职责链,请求在职责链上传递,直到处理者处理该请求
设计模式(26)行为型模式 - 职责链模式
行为型模式有11种,挺复杂,需要在运用中认真的琢磨
总结思考
关于设计模式的案例:https://gitee.com/zfkhhh/JavaDesignPatterns
创建型模式有5种,结构型模式有7种,行为型模式有11种,基本囊括的在开发过程中会碰到的场景
设计模式并没有教给我什么高深的知识,而是教给我底层的、编写代码的技巧
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性
真正的学会设计模式,是去思考设计模式的好处,为什么要在代码中使用设计模式?
使用设计模式,应当不拘泥与23种设计模式,而是在针对不同的场景使用7种原理去思考
Gof23种设计模式是Java面向对象的基本的模式,还有很多其他的模式,如MVC模式等,后续就在使用中学习吧
学海无涯苦作舟,勉励持续学习的你我
看到这里,点个赞呗(^_−)☆