Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >十五.各设计模式总结与对比

十五.各设计模式总结与对比

作者头像
编程之心
发布于 2020-08-12 08:17:54
发布于 2020-08-12 08:17:54
9080
举报
文章被收录于专栏:编程之禅编程之禅

1.各设计模式总结与对比

1.1.课程目标

1、 简要分析GoF 23种设计模式和设计原则,做整体认知。

2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。

3、 了解各设计模式之间的关联,解决设计模式混淆的问题。

1.2.内容定位

1、 掌握设计模式的"道" ,而不只是"术"

2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。

3、 不要为了用设计模式去生搬硬套,而是在业务上到遇到问题时,很自然地想到设计模式作为一种解 决方案。

1.3.一句话归纳设计原则

设计原则

一句话归纳

目的

开闭原则(OCP)(Open-Close)

对扩展开放,对修改关闭

减少维护带来新的风险

依赖倒置原则(DIP)(Dependence Inversion)

高层不应该依赖低层

更利于代码结构的升级扩展

单一职责原则(SRP)(Simple Responsibility)

一个类只干一件事

便于理解,提高代码可读性

接口隔离原则(ISP)(Interface Segregation)

一个接口只干一件事

功能解耦,高聚合、低耦合

迪米特法则(LoD)(Law of Demeter)

不该知道的不要知道

只和朋友交流,不和陌生人说话,减少代码臃肿

里氏替换原则(LSP) (Liskov Substitution)

子类重写方法功能发生改变, 不应该影响父类方法的含义

防止继承泛滥

合成复用原则(CARP)(Composite/Aggregate Reuse)

尽量使用组合实现代码复用,而不使用继承

降低代码耦合

1.4.G0F 23种设计模式简介

《Design Patterns: Elements of Reusable Object-Oriented Software》 (即 后 述 《设计模式》 — 书 ) ,由 Erich Gamma、 Richard Helm、 Ralph Johnson 和 John Vlissides 合著 (Addison-Wesley , 1995 )。这几位作者常被称为"四人组(Gang of Four)" ,而这本书也就被称为 "四人组(或 GoF )"书。

在 《设计模式》这本书的最大部分是一个目录,该目录列举并描述了 23种设计模式。另外,近来 这一清单又增加了一些类别,最重要的是使涵盖范围扩展到更具体的问题类型。例如,Mark Grand在 Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML (即后述《模式 Java 版》一书)中增加了解决涉及诸如并发等问题的模式,而 由 DeepakAlur. JohnCrupi和 Dan Malks 合著的 Core J2EE Patterns: Best Practices and Design Strategies —书中主要关注使用 Java 2 企 业技术的多层应用程序上的模式。

很多人并没有注意到这点,学完Java基础语言就直接去学J2EE,有的甚至鸭子赶架,直接使用起 Weblogic等具体J2EE软件,一段时间下来,发现不过如此,挺简单好用,但是你真正理解J2EE 了吗? 你在具体案例中的应用是否也是在延伸J2EE的思想?对软件设计模式的研究造就了一本可能是面向对 象设计方面最有影响的书籍:《设计模式》。

由此可见,设计模式和J2EE在思想和动机上是一脉相承的,我总结了以下几个原因:

  1. 设计模式更抽象,J2EE是具体的产品代码,我们可以接触到,而设计模式在对每个应用时才会产 生具体代码。
  2. 设计模式是比J2EE等框架软件更小的体系结构,J2EE中许多具体程序都是应用设计模式来完成的 ,当你深入到J2EE的内部代码研究时,这点尤其明显,因此,如果你不具备设计模式的基础知识(GoF 的设计模式),你很淮i夬速的理解J2EE。不能理解J2EE如何能灵活应用?
  3. J2EE只是适合企业计算应用的框架软件,但是GoF的设计模式几乎可以用于任何应用!因此GoF 的设计模式应该是J2EE的重要理论基础之一

所以说,GoF的设计模式是Java基础知识和J2EE框架知识之间一座隐性的”桥“。

设计模式其实也是一门艺术。设计模式来源于生活,不要为了套用设计模式而去使用设计模式。设 计模式是在我们迷茫时提供的一种解决问题的方案,或者说用好设计模式可以防范于未然。自古以来, 在我们人生迷茫时,我们往往都会寻求帮助,或上门咨询,或查经问典。就在几千年前,孔夫子就教给 了我们怎样做人。对于中国人来说都知道:从出生元婴、二十加冕、三十而立、四十不惑、五十知天命、 六十花甲、七十古稀不逾矩、八、九十耄耋…我们这就是在用模板模式,当然,有些人不会选择这套 模板。

设计模式总结的是经验之谈总结的是前人的经验,提供给后人去借鉴使用,前人栽树,后人乘凉。 设计模式可以帮助我们提升代码的可读性、可扩展性;降低维护成本;解决复杂的业务问题,但是,千 万千万不要死记硬背,生搬硬套。下面我们还是先来总体预览一下GOF23种设计模式的归纳和总结。

分类

设计模式

创建型

工厂方法模式(Factory Method )、抽象工厂模式(Abstract Factory ) 、单例模式(Singleton)、原型模式(Prototype、 建造者模式(Builder)

结构型

代理模式(Proxy ) 、门面模式( Facade ) 、装饰器模式(Decorator) 、孚兀模式( Flyweight) 、组合模式(Composite)、适配器模式(Adapter)、桥接模式(Bridge )

行为型

模板方法模式(Template Method ) 、策略模式(Strategy ) 、 责任链模式(Chain of Responsibility ) 、迭代器模式(Iterator) 、命令模式(Command ) 、 状态模式(State ) 、备忘录模式(Memento ) 、中介者模式(Mediator) 、 解释器模式(Interpreter)、观察者模式(Observer) 、访问者模式(Visitor)

1.5.设计模式使用频次总结

创建型模式(Creational)

高频: 工厂方法模式(Factory Method ) 、抽象工厂模式(Abstract Factory ) 、单例模式(Singleton)、建 造者模式(Builder)

低频 : 原型模式( Prototype )

结构型模式(Structural)

高频: 代理模式(Proxy ) 、门面模式(Facade ) 、装饰器模式(Decorator) 、享元模式(Flyweight) 、适配器模式(Adapter)、组合模式(Composite )

低频 : 桥接模式( Bridge )

行为型模式(Behavioral)

高频: 模板方法模式(Template Method ) 、策略模式(Strategy ) 、 责任链模式(Chain of Responsibility ) 、状态模式(State )

低频: 备忘录模式(Memento ) 、 观察者模式(Observer) s 迭代器模式(Iterator) s 中介者模式(Mediator)、命令模式(Command ) 、解释器模式( Interpreter) 、访问者模式(Visitor)

1.6.—句话归纳设计模式

各设计模式对比及编程思想总结

设计模式

一句话归纳

目的

生活案例

框架源码举例

工厂模式(Factory )

产品标准化,生产更局效

封装创建细节

实体工厂

LoggerFactory、 Calender

单例模式(Singleton )

世上只有一个Tom

保证独一无二

CEO

BeanFactory、 Runtime

原型模式(Prototype )

拔一根猴毛,吹出干万个

高效创建对象

克隆

ArrayList、PrototypeBean

建造者模式(Builder)

高配中配与低配, 想选哪配就哪配

开放个性配置步骤

选配

StringBuilder、BeanDefinitionBuilder

代理模式(Proxy )

没有资源没时间, 得找媒婆来帮忙

增强职责

媒婆

ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy

门面模式(Facade)

打开一扇门,走向全世界

统一访问入口

前台

JdbcUtils、RequestFacade

装饰器模式(Decorator)

他大舅他二舅,都是他舅

灵活扩展、同宗同源

煎饼

BufferedReader、Inputstream

享元模式(Flyweight)

优化资源配置,减少重复浪费

共享资源池

全国社保联网

String、Integer、ObjectPool

组合模式(Composite)

人在一起叫团伙, 心在一起叫团队

统一整体和个体

组织架构树

HashMap、SqINode

适配器模式(Adapter)

适合自己的,才是最好的

兼容转换

电源造配

AdvisorAdapten、HandlerAdapter

桥接模式(Bridge)

约定优于配置

不允许用继承

DriverManager

委派模式(Delegate )

这个需求很简单, 怎么实现我不管

只对结果负责

授权委托书

ClassLoader、 BeanDefinitionParserDelegate

模板模式(Template )

流程全部标准化, 需要微调请覆盖

逻辑复用

把大象装进冰箱

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考核

FileVisitor、BeanDefinitionVisitor

1.7.设计模式之间的关联关系和对比

单例模式和工厂模式

实际业务代码中,通常会把工厂类设计为单例。

策略模式和工厂模式

1、工厂模式包含工厂方法模式和抽象工厂模式是创建型模式,策略模式属于行为型模式。

2、工厂模式主要目的是封装好创建逻辑,策略模式接收工厂创建好的对象,从而实现不同的行为。

策略模式和委派模式

1、策略模式是委派模式内部的一种实现形式,策略模式关注的结果是否能相互替代。

2、委派模式更关注分发和调度的过程。

模板方法模式和工厂方法模式

工厂方法是模板方法的一种特殊实现。

对于工厂方法模式的create。方法而言,相当于只有一个步骤的模板方法模式。这一个步骤交给子类去 实现。而 模 板 方 法 呢 ,将 needHomework方 法 和 checkHomework方法交给子类实现, needHomework方法和checkHomework方法又属于父类的某一个步骤且不可变更。

模板方法模式和策略模式

1、 模板方法和策略模式都有封装算法。

2、 策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用。

3、 模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。

4、模板方法模式不能改变算法流程,策略模式可以改变算法流程且可替换。策略模式通常用来代替 if…else…等条件分支语句。

1、WechatPay、JDPay、AliPay是交给用户选择且相互替代解决方案。而 JdbcTemplate下面的子类是不能相互代替的。

2、策略模式中的queryBalanceOTJ法虽然在pay。方法中也有调用,但是这个逻辑只是出于程序健壮 性考虑。用户完全可以自主调用que「yBalance()方法。而模板方法模式中的mapRow()方法一定要在 获 得 ResultSet之后方可调用,否则没有意义。

装饰者模式和静态代理模式

1、 装饰者模式关注点在于给对象动态添加方法,而代理更加注重控制对对象的访问。

2、 代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造参数。

装饰者和代理者虽然都持有对方引用,但逻辑处理重心是不一样的。

装饰者模式和适配史器模式

1、 装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern ) 。

2、 装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配者 可以实现不同的接口。

装饰者和适配器都是对SiginService的包装和扩展,属于装饰器模式的实现形式。但是装饰者需要满足 OOP的 is-a关系,我们也讲过煎饼的例子,不管如何包装都有共同的父类。而适配器主要解决兼容问 题 ,不一定要统一父类,上图中LoginAdapter和 RegistAdapter就是兼容不同功能的两个类’但 RegistForQQAdapter需要注册后自动登录,因此既继承了 RegistAdpter又继承了 LoginAdapter。

适配器模式和静态代理模式

适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。

适配器模式和策略模式

在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘
Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,解决软件开发中的复杂问题。
Tom弹架构
2021/11/26
8340
1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦
Design Patterns: Elements of Reusable Object-Oriented Software(以下简称《设计模式》),一书由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。这四位作者常被称为“四人组(Gang of Four)”,而这本书也就被称为“四人组(或 GoF)”书。他们首次给我们总结出一套软件开发可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,解决软件开发中的复杂问题。
Tom弹架构
2021/10/29
7370
Java设计模式面试题
接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。
Tim在路上
2020/08/04
8090
Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南
此处主要讲解常见的是:单例、工厂方法(及 变式:工厂方法模式、抽象工厂模式)、建造者模式。
Carson.Ho
2021/12/06
3440
Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南
❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️
金九银十已经来了,挺近大厂最好的机会已经来了!如果你是要找工作的,一定要抓住这个机会!
全栈程序员站长
2022/06/29
2750
❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️
设计模式 | 总结篇
子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。
被水淹没
2023/02/25
3280
设计模式 | 总结篇
设计模式(总纲)
网上关于设计模式的文章很多,为什么我还要重复写设计模式的文章,在看到LZ大牛的一篇《聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路》博文后,发现自己陷入了思维误区,在之前看的一本《Java EE设计模式解析与指南》本中,提出一个反设计模式的思维,于是自己便成了这个思维的拥护者(还是懒)
tanoak
2018/08/02
2880
五万字详解“GoF”的23种设计模式
1995 年,GoF(Gang of Four,四人组,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人组成)合作出版了 **《Design Patterns: Elements of Reusable Object-Oriented Software》 **一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称【GoF设计模式】。
栗筝i
2022/12/09
3.7K2
五万字详解“GoF”的23种设计模式
设计模式-面试
开放封闭原则:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。
知识浅谈
2022/02/28
3830
设计模式专题(十四)——适配器模式
设计模式专题(十四)——适配器模式 (原创内容,转载请注明来源,谢谢) 一、概述 适配器模式(Adapter)是将一个类的接口转换成客户希望的另外一个接口,该模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。 在软件设计初期,通常不会用适配器模式,适配器模式属于一种亡羊补牢的措施。当代码量太大,而接口又经过多重的迭代,两个接口之间变得没法直接调用,而接口的调用点有太多,修改接口风险太大,则需要用到适配器模式。 另外,当需要调用第三方接口,如果第三方接口的调用方式和系统内部已经写好的方式不同,也
用户1327360
2018/03/07
6300
设计模式专题(十四)——适配器模式
简述一下你了解的设计模式
所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。 在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中给出了三类(创建型[对类的实例化过程的抽象化]、结构型[描述如何将类或对象结合在一起形成更大的结构]、行为型[对在不同的对象之间划分责任和算法的抽象化])共23种设计模式,包括:Abstract Factory(抽象工厂模式),Builder(建造者模式),Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式);Facade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(责任链模式)。 面试被问到关于设计模式的知识时,可以拣最常用的作答,例如:
唐怀瑟
2018/08/30
6290
Java常用设计模式
工厂是干嘛的,就是用来生产的嘛,这里说的工厂也是用来生产的,它是用来生产对象的。也就是说,有些对象我们可以在工厂里面生产,需要用时直接从工厂里面拿出来即可,而不用每次需要用的时候都去new对象。工厂方法模式又分为以下三种:
贪挽懒月
2018/12/11
2.4K0
二十三种设计模式 之 初识设计模式
设计模式(Design Pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。它并不是语法规定而是一套帮助我们增强代码的可重用性、可扩充性、 可维护性、可读性、健壮性以及安全性的解决方案!
木字楠
2022/11/15
2400
设计模式系列(开篇):啥是设计模式?
前端时间,花了一段时间去整理并开发了一个用于刷面试题的小程序《面试手册》;整理各种资料,耗费了比较多的时间,虽然还有更多的资料需要整理,决定暂时换个方式,缓解缓解,来整理一下设计模式系列。
一行Java
2022/04/07
3660
设计模式系列(开篇):啥是设计模式?
如何用一句话总结23种设计模式
创建型模式简单来说就是用来创建对象的。一共有五种:单例模式、建造者模式、工厂方法模式、抽象工厂模式、原型模式。
lyb-geek
2019/11/22
7600
业余草谈设计模式
设计模式之间并不是完全独立的,而是互相之间,会有一些相同的影子,下面我们来一起总结下这24种设计模式。
业余草
2019/01/21
4130
浅谈PHP中的设计模式
个人感觉所谓 php 设计模式,就像 36 计一样,不是你天天读 36 计,就可以自诩自己的 36 计很牛逼,同样你不知道 36 计,你一样可以会用 36 计而已,何故面试官以 PHP 设计模式来取人? 总体来说设计模式分为三大类: (1)创建型模式——共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式——共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 (3)行为型模式——共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责
沈唁
2018/05/24
6840
Spring的设计模式快速入门干货
设计模式是一套被反复使用的、多数人知晓的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
全菜工程师小辉
2019/08/16
4530
设计模式分类
     在《设计模式》这本书中列举并描述了23种设计模式,分为创建型模式、结构型模式和行为型模式。另外,近来这一清单又增加了一些类别,例如,并发型模式、线程池模式、Java EE企业技术的多层应用程序上的模式等。下面来看看每一种类型包含哪些设计模式。 一 创建型模式 GoF中共描述了5种创建型模式。 1.工厂方法模式(Factory Method) 定义一个接口用于创建对象,但是让子类决定初始化哪个类。工厂方法把一个类的初始化下放到子类。 2.抽象工厂模式(Abstract Factory) 为一个产品族
猿人谷
2018/01/17
6940
【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★
开闭原则 是 面向对象 设计 中 , 最基础的 设计原则 , 它指导我们建立稳定灵活的系统 ;
韩曙亮
2023/03/29
1.4K0
【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★
相关推荐
花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档