1、总结设计原则和 GOF 23,做整体认知
2、为之后深入学习源码分析做铺垫
3、了解各设计模式之间的关联,解决设计模式混淆的问题
1、《Design Patterns:Elements of Reusable Object-Oriented Software》[ 即,后述《设计模式》一书 ]
2、由 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 合著 [ Addison-Wesley,1995 ]
3、这几位作者常被称为 " 四人组 [ Gang Of Four ] ",而这本书也就被称为" 四人组 [ 或 GOF ] "书
4、GOF 的设计模式是 Java 基础知识 和 J2EE 框架知识之间的一座 " 隐性的桥 "
设计模式 | 一句话总结 | 目的 | 生活方案 | 框架源码举例 |
---|---|---|---|---|
工厂模式 [ Factory ] |
产品标准化 生产更高效 |
封装创建细节 | 实体工厂 | LoggerFactory Calender |
单例模式 [ Singleton ] |
世上只有一个秦始皇 | 保证独一无二 | CEO | BeanFactory Runtime |
原型模式 [ Prototype ] |
拔一根猴毛 吹出千万个 |
高效创建对象 | 克隆 | ArrayList PrototypeBean |
建造者模式 [ Builder ] |
高配中配低配 想选哪配就哪配 |
开放个性配置步骤 | 选配 | StringBuffer BeanDefinitionBuilder |
设计模式 | 一句话归纳 | 目的 | 生活案例 | 框架源码举例 |
---|---|---|---|---|
代理模式 [ Proxy ] |
没有资源没时间 得找媒婆来帮忙 |
增强职责 | 媒婆 | ProxyFactoryBean JdkDynamicAopProxy CglibAopProxy |
门面模式 [ Facade ] |
打开一扇门 走向全世界 |
同意访问入口 | 前台 | JdbcUtils RequestFacade |
装饰器模式 [ Decorator ] |
万剑归一 | 灵活扩展,同宗同源 | 煎饼 | BufferedReader InputStream |
享元模式 [ Flyweight ] |
优化资源配置 减少重复浪费 |
共享资源池 | 全国社保联网 | String Integer ObjectPool |
组合模式 [ Composite ] |
人在一起叫团伙 心在一起叫团队 |
统一整体和个体 | 组织架构数 | HashMap SqlNode |
适配器模式 [ Adapter ] |
适合自己的 才是最好的 |
兼容转换 [求同存异] | 电源适配器 | AdvisorAdaper HandlerAdaper |
桥接模式 [ Bridge ] |
约定优于配置 | 不允许继承 | 桥 | DriverManager |
设计模式 | 一句话归纳 | 目的 | 生活案例 | 框架源码举例 |
---|---|---|---|---|
委派模式 [ Delegate ] |
这个需求很简单怎么实现我不管 | 只对结果负责 | 授权委托书 | ClassLoader BeanDefinitionParserDelegate |
模板方法模式 [TemplateMethod] |
流程全部标准化 需要微调请覆盖 |
逻辑服用 | 把大象装进冰箱 | JdbcTemplate HttpServlet |
策略模式 [ Strategy ] |
条条大路通罗马 | 把选择权交给用户 | 选择支付方式 | Comparator InstantiationStrategy |
责任链模式 [ Chain Of Responsibility ] |
各人自扫门前雪 莫管他人瓦上霜 |
解耦处理逻辑 | 踢皮球 | FilterChain Pipeline |
迭代器模式 [ Iterator ] |
流水线上坐一天 每个包裹扫一遍 |
集合的统一访问 | 统一刷脸进站 | Iterator |
命令模式 [ Command ] |
运筹帷幄之中 决胜千里之外 |
解耦请求和处理 | 遥控器 | Runnable TestCase |
状态模式 [ State ] |
状态驱动行为 行为决定状态 |
绑定状态和行为 | 订单状态跟踪 | Lifecycle |
备忘录模式 [ Memento ] |
给我一剂"后悔药" | 备份 | 草稿箱 | StateManageableMessageContext |
中介者模式 [ Mediator ] |
联系方式我给你 具体操作只看你 |
统一管理资源 | 朋友圈 | Timer |
解释器模式 [ Interpreter ] |
我想说"方言" 一切解释权归我所有 |
特定语法解析 | 摩斯密码 | Pattern ExpressionParser |
观察者模式 [ Observer ] |
到点就通知我 | 解耦 : 观察者,被观察者 | 闹钟 | ContextLoaderListener |
访问者模式 [ Visitor ] |
横看成岭侧成峰 远近高低各不同 |
解耦 : 数据结构,数据操作 | KPI考核 | FilVisitor BeanDefinitionVisitor |
代理,职责增强,不仅要建立联系,还要参与过程
中介,只负责牵线搭桥,建立联系
代理,组合实现功能增强和扩展
装饰,继承实现增强和扩展
代理,一定会有增强
委派,全权的静态代理,不做任何的增强
何功能增强的代理就叫委派。
委派,没有流程的概念,只需要拿到结果
责任链,处理流程,处理流程可扩展,可定制,最终由责任链中的某些 Handler来决定
在门面里面,可能会用到委派模式实现任务分发
门面,打开一扇窗,通向全世界,统一入口,背后很多子系统,承担一定的静态代理
装饰器,为了扩展,一定是同宗同源的
建造者,强调对象创建步骤的个性化
装饰器,更加强调扩展性,大桶套小捅
行为型,对 Java 中的方法的使用提出的建议
结构型,对 Java 类的组合提出建议
创建型,对创建 Java 对象的形式提出的建议
抽象工厂,形式上可能会出现抽象方法,但是并不能体现流程。
模板方法,也是有可能出现抽象方法,但一定是某个流程中的一个步骤
一般来说他们两个会组合使用,策略将由工厂来创建
工厂方法,产品扩展
抽象工厂,产品等级结构和产品组的相互扩展关系,多维度,至少是二维
共同点,不用结成,一定是组合
桥接,两个维度建立链接
中介者,多维度建立链接 [ 一个更复杂的桥接模式的实现 ]
桥接,两个继承体系建立链接,反而就是为了满足个性
组合,目的不是为了建立链接,而是为了统一行动,统一一套API
适配器,解决兼容问题,可以用继承,也可以用组合
中介者,一定是组合,所有人可能都持有中介者引用
适配器,兼容
策略,把选择权交给用户
没有可比性
桥接,不用继承建立联系
适配器,类适配器用的继承,对象适配器用的是组合,接口适配器实际上也是用的继承
桥接,需要也给中间的类,一定由功能实现
命令,需要一个抽象的中间类,只是为了规范
命令,解耦请求和处理 [ 原本可以写在一起的 ],会有一个回调,会有反馈和处理结果
策略,固定好的选项,一定是同样的结果,一定要用户有参与
共同点,都有一个清单,给你啥就是啥
我们可以把对象池的容器设置为单例,同时,把对象池所在的类设置为单例的工厂
有时候会混用,模板模式中可能设计的勾子方法,就是某一策略的实现
原文:https://www.cnblogs.com/JustDoIt-1221/p/14620781.html