文档中涉及的设计模式示例代码GitHub地址:https://github.com/iamluyang/javabook

《Java咖啡与设计模式》电子书即将更新,内容更加生动有趣,深入浅出,配合插画师的灵魂手绘

GOF - 图1
这个教程简洁意骇,提供了玩具代码和现实世界代码的示例。不要太在意例子中的实现,设计模式不是一成不变的,并且随着一些新增语言特性的加入,也会有所改变。设计模式很多都来源于单机客户端程序热门的时期,例如单例模式在分布式环境就不再是单例,协调者模式看上去和基于消息中间件的解耦一般,迭代器模式和观察者模式的基类已经被纳入到JDK的标准库中,甚至很多设计模式是站在性能的角度所引入了,代码看上去也很相似,来来回回的运用接口,抽象,继承,多态。行为相关的模式往往可以配合多种设计模式一起使用。如果是编写一些动态框架无非就是和注解,反射,注册器这些基本技术点一起配合使用。如果你的工作与业务紧密相关,熟练掌握设计模式可以有利于编写容易扩展的业务代码。如果与性能有关,也可以帮助你将业务代码与性能代码进行隔离。设计模式的本质在于为开发者提供了面对对象编程的设计准则,这些设计准则适用于特定的开发场景,但模式之间还可以相互组合,不断演变。设计模式如同工程设计的标准语言,有经验的开发者遵循这些设计准则时,无论他们说的是那种国家的语言,或来自不同的公司与组织,大家都可以基于代码本身理解程序设计的意图。

不需要用所谓的业务来套设计模式,或者设计模式去套业务,回归本源依然是OOP的问题

Creational 模式 - 本质在于关注对象如何创建,何时创建,创建多少

单例模式:创建需要控制数量的对象 - 当你需要控制创建对象的具体个数,就用单例模式
抽象工厂:创建一组相互关联的对象 - 当你需要批量的替换一组平行对象,就用抽象工厂
构建模式:创建的对象有局部与整体 - 当你需要解决指挥创建对象的行为,就用构建模式
简单工厂:隐藏对象构造函数的调用 - 当你需要隐藏复杂的构造函数行为,就用简单工厂
原型模式:避免每次都调用构造函数 - 当你需要减缓构造函数的性能损耗,就用原型模式
工厂方法:使用对象和创建对象分离 - 当你需要延缓具体对象的创建时机,就用工厂方法

Structural 模式 - 本质在于关注对象之间的相互包装,如何包装,何时包装

如何理解相互包装(Wrapper),例如适配器模式中适配对象对被适配对象的包含;代理模式中代理对象对被代理对象的包装;装饰器模式中装饰对象对被装饰对象的包装;组合模式中复合对象对子对象的包装;门面模式中门面对象对内部子对象的包装;桥接模式中行为的主体对行为的包装;享元模式中缓存容器对被缓存对象的包装;

  • 适配模式:对象结构需要能够适配其他系统要求的结构 - 当你需要兼容目标接口又无法改变自身接口的时候,就用适配模式
  • 桥接模式:对象的结构被拆分成—我是谁和我能做什么 - 当你需要减缓对象因继承导致水平方向的快速增长,就用桥接模式
  • 组合模式:对象之间通过具有层次结构的组合协同工作 - 当你需要业务组件以某种无顺序约束的方式相嵌套,就用组合模式
  • 门面模式:对象的访问被聚集到一个统一的门面结构中 - 当你需要聚合多个小的组件并在一个大组件中访问,就用门面模式
  • 代理模式:对象结构在不被破坏的前提下实现功能增强 - 当你需要不修改现有对象保留现有接口但增强功能,就用代理模式
  • 装饰器模式:对象之间通过叠加装饰的结构来协同工作 - 当你需要业务组件以某种有顺序约束的方式相嵌套,就用装饰模式
  • 享元模式:对象的缓存机制 - 当你需要重复使用并缓存那些已经创建出来的对象,就用享元模式

Behavioral 模式 - 本质在于关注对象动作,对象状态,对象交互

  • 模板模式:模板的流程逻辑发生了变化 — 当你需要分离上层算法和下层实现,就用模板模式
  • 状态模式:对象的状态发生了迁移变化 — 当你需要解决对象状态的迁移行为,就用状态模式
  • 命令模式:系统中产生了新的业务命令 — 当你需要横向的扩展业务命令组件,就用命令模式
  • 策略模式:业务的处理策略发生了变化 — 当你需要灵活替换业务策略或算法,就用策略模式
  • 调停模式:组件间通讯关系发生了变化 — 当你需要以中心化协调组件的通讯,就用调停模式
  • 备忘录模式:对象的操作栈发生变化 — 当你需要记录对象的状态改变轨迹,就用备忘模式
  • 访问者模式:被访问对象发生了新增 — 当你需要面临指令的横向快速扩展,就用访问模式
  • 观察者模式:观察的对象发生了变化 — 当你需要以回调的方式来接收响应,就用观察模式
  • 迭代器模式:迭代器内部游标的变化 — 当你需要基于迭代器方式遍历对象,就用迭代模式

想一想是不是就是这么回事…………….

GOF - 图2