前言
相信大家在面试的时候经常会听到这些问题:
说说你用过的设计模式有哪些?
Spring里面都用到了哪些设计模式?
这些问题都是面试高频题,但是想回答的漂亮,属实不易。
首先,设计模式有23种之多,光靠背官方给的定义面试官一个问题就能问的哑口无言,
其次,就算是有几年开发经验的老鸟,也不一定真正在开发中用过设计模式,面试官只要一提到业务场景,必懵!
所以,一条决定出一个设计模式的专栏,讲明白的前提下每个设计模式至少配一个业务场景。融会贯通,学以致用。
一、初见设计模式
1.什么是设计模式
设计模式最早由提谁提出的呢?
1994 年,埃里希·伽玛、 约翰·弗利赛德斯、 拉尔夫·约翰逊和理查德·赫尔姆这四位作者出版了 《设计模式: 可复用面向对象软件的基础》 一书, 将设计模式的概念应用到程序开发领域中。 该书提供了 23 个模式来解决面向对象程序设计中的各种问题, 很快便成为了畅销书。 由于书名太长, 人们将其简称为 “四人组 (Gang of Four, GoF) 的书”, 并且很快进一步简化为 “GoF 的书”。
什么是设计模式
一句话:设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。
和算法有什么区别
其实两者都是问题的通用解决方案,区别在于:
算法更像是菜谱
: 提供达成目标的明确步骤。 而模式更像是蓝图
: 你可以看到最终的结果和模式的功能, 但需要自己确定实现步骤。
2.设计模式分类
了解其分类只要帮助我们整体理解和记忆设计模式,23种,数量可不少,光记名字就不简单。
根据目的来分
- 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。
- 结构型模式:用于描述如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。
- 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。
根据作用范围来分
- 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来。
- 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。
一张表搞定
范围/目的 | 创建型模式 | 结构型模式 | 行为型模式 |
类模式 | 工厂方法 | (类)适配器 | 模板方法、解释器 |
对象模式 | 单例 原型 抽象工厂 建造者 | 代理 (对象)适配器 桥接 装饰 外观 享元 组合 | 策略 命令 责任链 状态 观察者 中介者 迭代器 访问者 备忘录 |
3.用设计模式的好处
或许你已从事程序开发工作多年, 却完全不知道单例模式是什么。 很多人都是这样。 即便如此, 你可能也在不自知的情况下已经使用过一些设计模式了。 所以为什么不花些时间来更进一步学习它们呢?
· 设计模式是针对软件设计中常见问题的工具箱, 其中的工具就是各种经过实践验证的解决方案。 即使你从未遇到过这些问题, 了解模式仍然非常有用, 因为它能指导你如何使用面向对象的设计原则来解决各种问题。
· 设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。 你只需说 “哦, 这里用单例就可以了”, 所有人都会理解这条建议背后的想法。 只要知晓模式及其名称, 你就无需解释什么是单例。
二、一句话解读
到压轴菜了,一张表,每个设计模式一句话,不懂你来公众号找我。
设计模式 | 标准定义 | 通俗解读 | 详细讲解 |
工厂方法Factory Method |
定义一个用于创建对象的接口,让其子类决定将哪一个类实例化。 | 兵工厂:给你产了把M416 ,你拿着它吃了鸡;给你女朋友一把AK47 ,落地成盒。 |
传送门 |
建造者Builder |
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 | 生产流水线:以前是手工业,由人工把单个的生产零件一步步组装好,后来有了工业革命,都由生产流水线代替。 | 待完成 |
原型Prototype |
用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。 | 印刷术:以前只能临贴抄写费时费力,效率极低,有了印刷术,突突的。 | 待完成 |
单例singleton |
保证一个类仅有一个实例,并提供一个访问它的全局访问点。 | 确保唯一:你养了6只猫,他们饿了都找你,你是唯一的,不会有第二个。 | 待完成 |
适配器Adapter |
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 | 翻译官:你去美国外,你只会中文,当地人只会英文,导游都会——Adapter | 待完成 |
装饰器Decorator |
动态地给一个对象添加一些额外的职责。就扩展功能而言,比生成子类方式更为灵活。 | 衣服:人靠衣装马靠鞍,打扮打扮,弄点装饰,好看多了 | 待完成 |
桥接Bridge |
将抽象部分与它的实现部分分离,使它们都可以独立地变化。 | 马有黑白公母之分。说这是马 太抽象,说这是黑色的公马 又太死板,只有说这是(黑色的或白色的)(公或母)马 才显得灵活而飘逸。 |
待完成 |
组合Composite |
将对象组合成树形结构以表示“部分-整体”的层次结构。使得客户对单个对象和复合对象的使用具有一致性。 | 大家族:子又生孙,孙又生子,子子孙孙,无穷尽也,将众多纷杂的人口组织成一个按辈分排列的大家族即是此模式的实现。 | 待完成 |
外观Facade |
为子系统中的一组接口提供一个一致的界面, 定义一个高层接口,这个接口使得这一子系统更加容易使用。 | 求同存异:高中毕业需读初中和高中,博士也需读初中和高中,因此国家将初中和高中普及成九年制义务教育。 | 待完成 |
享元Flyweight |
运用共享技术有效地支持大量细粒度的对象。 | 一劳永逸:认识三千汉字,可以应付日常读书与写字,可见头脑中存在这个汉字库的重要。 | 待完成 |
代理Proxy |
为其他对象提供一个代理以控制对这个对象的访问。 | 垂帘听政:犹如清朝康熙年间的四大府臣,很多权利不在皇帝手里,必须通过辅佐大臣去办。 | 待完成 |
责任链Chain of Responsibility |
为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 |
租房:以前为了找房到处打听,现在只需要找房屋中介,你找中介,中介找房东,直到你租到满意的房子。 | 待完成 |
命令Command |
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。 | 借刀杀人:以前是想杀谁就杀,自己动手,导致结仇太多,于是假手他人,挑拨他人之间的关系从而达到自己的目的。 | 待完成 |
解释器Interpreter |
给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。 | 文言文注释:一段文言文,将它翻译成白话文。 | 待完成 |
迭代器Iterator |
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 | 赶尽杀绝:一个一个的搜索,绝不放掉一个。 | 待完成 |
中介者Mediator |
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 | 三角债:本来千头万绪的债务关系,忽出来一中介,包揽其一切,于是三角关系变成了独立的三方找第四方中介的关系; | 待完成 |
备忘录Memento |
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。 | 记事本:记性不好,把发生的事记下来。 | 待完成 |
观察者Observer |
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 | 看守者:一旦被看守者有什么异常情况,定会及时做出反应。 | 待完成 |
状态State |
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。 | 发布博客:一篇博客有草稿,待审核,已发布三种状态,在这三种状态下发布会有不同的行为。 | 待完成 |
策略Strategy |
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。 | 久病成良医:人生病可以有各种症状,但经过长期摸索,就可以总结出感冒、肺病、肝炎等几种; | 待完成 |
模板方法Template Method |
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 | 理论不一定要实践:教练的学生会游泳就行了,至于教练会不会则无关紧要; | 待完成 |
访问者Visitor
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。卖保险:优秀的保险代理人总能为不同类型的团体提供不同的保单。待完成
以上就是23种设计模式的通俗解读,更详细的代码
及业务场景相关
,一条会逐渐更新,并在本篇表格更新对应的文章地址,什么意思该懂了吧(快收藏呀
)。
着急看的,欢迎到一条的公众号**一条IT
**催稿。
我是一条,一个在互联网摸爬滚打的程序员。
道阻且长,行则将至。大家的 【点赞,收藏,关注】 就是一条创作的最大动力,我们下期见!
注:关于本篇博客有任何问题和建议,欢迎大家留言!