Skip to content

Latest commit

 

History

History
201 lines (123 loc) · 19.8 KB

README.md

File metadata and controls

201 lines (123 loc) · 19.8 KB

推荐使用 wiki 食用更香https://github.com/lvgocc/java-design-patterns/wiki

原创声明:除设计模式背景或概念性内容外,其余全部内容均为自己深入理解原创输出,希望能够得到你支持的 star ⭐

设计模式(Java实现)

  设计模式专题,共 23 种设计模式。每种设计模式均从根本出发,深入理解设计思想,再配合一些小故事加以理解,让设计模式变得通俗易懂。让自己和现在正在阅读的你,能够知其然而知其所以然。

  • 提到单例想到 “饿汉?,懒汉?”
  • 提到工厂想到 “汽车?”
  • 提到抽象工厂想到 “一个大的工厂?“
  • 提到适配器想到 “插头?USB?”

  如果是,我相信这里很适合你阅读学习。设计模式学了不会用?可以看两篇试一试,同样的知识,不一样的“味道”。

"每一篇...(突然被打断)"

“don't talk, show me see see”

"好的大哥,这就安排!"

每一篇都有对应的文章配合源码学习,文章通俗易懂。以学渣的姿态来学习学霸的知识,我不善搞深奥的东西,但喜欢将深奥的东西变成简单的东西,我深信复杂度守恒定律,我也相信讲出来的东西是为了让大家能听懂而不是自己秀知识储备而已。听懂掌声。

软件设计模式背景

当我们要学习一门技术或者一类知识的时候,先去了解学习它的背景,会对我们接下来的学习和理解产生一些潜移默化的影响和帮助

这个背景千篇一律,事实就是如此。我用自己的话在总结一下。

“设计模式”最初的提出,是在建筑领域。🌉

  1977 年被美国的建筑大师🕍 克里斯托夫·亚历山大 (Christopher Alexander)在他的著作📕《建筑模式语言:城镇、建筑、构造(A Pattern Language: Towns Building Construction)中描述了一些常见的建筑设计问题,并提出了一系列的解决方案, 至此称为模式。

  2年后,1979年,克里斯托夫·亚历山大 在他的另一本著作📙《建筑的永恒之道》(The Timeless Way of Building)进一步强化了设计模式的思想。

  直到 1990 年,也就是 13 年后。设计模式一词才到了软件工程界,同时为此开辟了专题研讨会。

GOF👨‍🦲👦👨🧑

  在“设计模式”进入软件行业后的第5年,也就是 1995 年,艾瑞克·伽马(ErichGamma)👨‍🦲、理査德·海尔姆(Richard Helm)👦、拉尔夫·约翰森(Ralph Johnson)👨、约翰·威利斯迪斯(John Vlissides)🧑等 4 位作者合作出版了📘《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书。

  从此掀起了软件工程界的“设计模式”浪潮,使越来越多的开发者受益,同时涌现出了越来越多的设计模式。而这 4 位作者在软件领域小组名称 Gang of Four 四人组(四人帮),后来设计模式也以此匿名著称 GOF。

gof

设计模式要做的事情

  现如今的设计模式可远不止笔者这里收录整理学习的 23 种,而要比这多太多太多,但这么多的设计模式希望做的事情确实相同的。都是为了能够被反复利用,解决不断重复出现的问题而存在的,就像当初 GOF 写的那本书一样,‘可复用面向对象的基础’。

  一种方法,解决n种问题。这就是模式,它要解决的,就是拥有共性的问题。

设计模式基本原则

基本原则摘自 http://c.biancheng.net/design_pattern/

  当问题的解决方案有很多时,该怎么权衡哪一个方案可以成为是模式呢?这就有了原则性的约束。为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,我们应当要尽量根据 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。

  • 1️⃣ 开闭原则 OCP , 1988 年 勃兰特·梅耶(Bertrand Meyer)在其著作《面向对象软件构造》📕中提出 :软件实体应当对扩展开放,对修改关闭。

  • 2️⃣ 里式替换原则 LSP ,1987 年 里斯科夫(Liskov)女士👩‍🦰 的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》📜提出:继承必须确保超类所拥有的性质在子类中仍然成立。

  • 3️⃣ 依赖倒置原则 DIP ,1996 年 Object Mentor 公司总裁罗伯特·马丁(Robert C.Martin)🧑在C++ Report 上发表的文章 :高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象 (要面向接口编程,不要面向实现编程。)

  • 4️⃣ 单一职责原则 SRP,罗伯特·C.马丁🧑(与DIP原则同一人)(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分

  • 5️⃣ 接口隔离原则 ISP,2002 年罗伯特·C.马丁🧑 给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上。以上两个定义的含义是:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

  • 6️⃣ 迪米特法则又叫作最少知识原则 LOD/LKP ,1987 年美国东北大学👨‍🎓(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始人之一布奇(Booch)🧙‍♂️普及,后来又在经典著作《程序员修炼之道》📕中提及,从而传播开来。原则定义:只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。

  • 7️⃣ 合成复用原则 CRP 又叫组合/聚合复用原则,提倡软件复用过程中,优先使用组合复用,其次考虑继承,(如果使用继承,必须遵循里式替换原则),它与里式替换原则相辅相成。

对于原则的定义和约束,在多个设计模式中会有具体体现及说明。

🎨 设计模式分类

摘自 GOF 设计模式一书中文版译文,可能有内容有出入,还请参考原著辅助阅读。

  根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。

每种类型在对应部分中会再进行着重说明

  1. 🏗创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
  2. 🖇结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
  3. 🎭行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。

在通过表格的形式帮助理解学习和记忆

按照作用来划分

范围\目的 创建型模式 结构型模式 行为型模式
类模式 工厂方法 (类)适配器 模板方法
解释器
对象模式 单例
原型
建造
抽象工厂
(对象)适配器
外观
装饰
桥接
代理
享元
组合
状态
命令
责任链
策略
观察者
中介者
访问者
备忘录
迭代器

以上我们已经对设计模式有一个比较全面的简单了解了. 那么现在,开始吧!


🏗 创建型(5)

🖇 结构型(7)

🎭 行为型(11)

系列专题

  该设计模式专题将用以记录笔者技术生涯的一次沉淀过程,一共分为 23 篇文章以及对应的源码内容,文中内容和源码均为自我理解学习沉淀分享。

  笔者技术水平、理解能力均有限,如有读者发现有歧义甚至错误的地方,希望可以通过评论或私信或邮箱([email protected])等等让我知道的途径提醒笔者改正。

参(jù)考(rén)文(jiān)献(bǎng)

  非常感谢以下平台或书籍或个人的无私贡献知识资源,才能够让我有更多机会去学习了解各类知识。同时在此列出系列文章中的全部出处来源,同时后续在各篇独立文章中如有涉及也会尽可能的列出。排名不分先后。


亦或繁星、亦或尘埃。星尘✨,为了梦想,学习技术,不要抱怨、坚持下去💪。

关注星尘的一个朋友获取源码、加群一起交流学习🤓。

星尘的一个朋友