初读GoF经典

GOF设计模式 经典之作 GOF的设计模式,经典之作,必看!!!!! 立即下载

GoF的经典之作,介绍了21个设计模式,并给出了这些模式的相互关系,如何在实际的设计中选择和运用,演化这些模式。

花了三个下午,很快的通读了一下,把自己记住的东西和理解记下来,以后可以不断补充。

设计模式的核心思想是要封装变化,让设计可以在变化中保持相对的稳定,这也刚好符合了,敏捷方法中拥抱变化的思想,所以模式是敏捷方法成功的必要技术。

同时,设计模式的描述的几个关键的部分:

  1. 意图(可以解决的问题的一般/抽象描述)
  2. 动机(产生出来的CASE,即所解决的问题的具体描述)
  3. 结构和交互
  4. 适用情况
  5. 效果(优缺点)

让印证了GoF在6.5章节关于重构中介绍的,这里介绍的模式都是在平常项目的OO设计的不断扩展和重构中总结出来的。所以,运用模式确实可以 避免到很多不必要得重构工作。但是,个人认为,对设计的反思和重构是有益的,有机会可以看看关于重构的文献。

简单写一下我所理解的21个设计模式:

创建性模式:抽象了系统如何创建对象实例。

  1. 抽象工厂,透明地创建一系列相关的对象
  2. 工厂方法,透明地创建一个与实现工厂方法的对象所依赖的对象,通常是XXXModifier等等
  3. Builder,创建复杂对象的时候,可以按照一个对象的创建脚本/蓝图来创建,而如何创建复杂对象中元素的方法可以透明地变化。
  4. 单体,保证只有一个对象实例创建,是全局变量的很好的代替品,为了让单体是线程安全的,可以采用双检查枷锁。
  5. 原型,这是动态load新的类到系统中,并创建这些动态load进入系统类的实例的唯一办法。也是,欧感觉很聪明的一种创建模式。

结构模式:描述了使用对象来构建更大的系统的方法

  1. Adapter,把一个已经有的接口改造成另一个借口,这用可以复用这个已有的对象实现。有类方法和对象方法。
  2. Bridge,把一个子系统的分成接口和实现两个类层次,这样接口和实现可以独立地改变。
  3. Composite,如何把系统表示成递归的结构,而且可以用统一的方法来处理原子对象和组合对象,“树“是最好的抽象结构。
  4. Decorator,不用继承这样的静态方法来给对象增加功能,而是创建一个实现了新功能的新对象并把所有旧对象的旧功能直接代理给旧的对象,这就支持了对象功能的动态增加和撤销。
  5. Facade,给一个子系统提供一个单一的,容易理解和使用的接口。
  6. Flyweight,一个好的设计,可以避免系统产生大量的很细小的对象。对象的属性被分成,编译时的/静态的/内在的 vs. 运行时的/动态的/外部的,只有编译时的的属性被放在这些对象中,其他的运行时属性被作为对象方法的Context参数在运行时传入。
  7. Proxy,如果要隐藏子系统的外部特殊细节/或添加特殊附加功能,通常要给子系统增加proxy,以简化客户对子系统的访问。譬如:远程代理(远程调用),虚代理(create-when-necessary的逻辑),保护代理(安全检查和保护逻辑),智能reference(引用计数,动态加载,撤销的逻辑)。这是很常用和重要的一个模式,可以说基本上每一个子系统在重构时都会产生proxy,不过是不同的代理类型。

OO设计的思想就是,系统由相互依赖的对象组成。所谓依赖,就是对象相互通讯/调用,对象间依赖关系,设计的是否有效,直接决定了系统的运行是否有效;依赖关系是否松散,直接表现为设计是否可以有效地复用以应对面对变化。所以:

  1. 如何有效地为各个对象分配职责(OO设计中最重要的“荒岛技术”)。
  2. 如何有效地定义对象通讯的策略,以达到效率和松散耦合的平衡。

对象之间通讯的方式,本质上来讲只有两种:请求 vs. 消息。从耦合的程度来讲,一般认为,请求比消息的耦合大,消息只是数据耦合,但是,毕竟是都有耦合。所以,为了要面对变化的需求,我们需要改变请求/消息的发送者和接受者。如果我们设计的通讯策略,可以让我们在改变一方的时候,另一方不需要改变,那么我们也就有效地复用了不需要改变的一方。

行为模式:描述了这两个OO设计的核心方面,所以行为模式是最多,也是最丰富的。在UML中,协作通常由交互图或者顺序图来描述。

  1. 职责链,让多个对象都有机会来处理请求,这样就可以对请求发送对象透明地、动态地改变响应请求的对象。ACE STREAM FRAMEWORK就是这个模式的实现框架。
  2. 命令,把请求,和接受请求的对象索引,一起封装在一个命令对象中,这样就避免了命令的请求者(Invoker)和命令的接受者之间的耦合,也可以让命令支持排序、批量处理、撤销等事务操作。
  3. 迭代器,有效地为集合对象提供顺序访问集合元素的设计。可以很好的把集合的内部结构,集合元素的排序和遍历算法封装在了Iterator中。很多,STL地容器都有自己的迭代器。
  4. 中介(Meidator),把多个对象之间如何协作的逻辑封装在了中介里,这样协作的多个对象,相互就没有了直接的耦合,各自变化不会波及到其他的对象中去。
  5. 备忘录(Memento),可以在不破坏一个对象的封装的情况下,把对象的内部状态纪录下来。其实,它最大的好处是,可以让具有备忘录的对象,可以很容易地实现回滚。
  6. 观察着(Obserever ),如何来实现对象间一对多,或者多对多的依赖。通常,复杂的依赖关系,还会引入一个改变管理器(mediator ),来管理发生改变消息的传播。这是最重要,最常用的行为模式,因为OO就是多个对象相互依赖(通讯而达到协作)。
  7. 状态机(STATE ),在具有庞大的判断逻辑的算法中,把算法设计成为形式化的状态机是必然的选择,state模式给OO提供了一个实现状态机的合理抽象,即抽象出状态这个对象。经管,把状态机抽象成为状态转换表示最经典和常用的,不过如果对象的行为特性是由状态来控制行为,那么仅仅通过状态转换表来定义状态转换,是不够的。这时,就要借助state模式了。
  8. 策略(Strategy),策略把对象行为中的算法/逻辑抽象为策略,并设计为可以改变的。这是一个很好的替代继承而改变对象行为的方法。通常,会把对象的类,设计为可策略化的类模板。
  9. 模板方法,定义一个行为的步骤骨架,而把步骤地实现都放到子类中去。
  10. 访问者(VISITOR ) ,如果对象的内部结构很复杂,同时这个对象的某个操作的逻辑需要分散到对象的各个组成元素中去,那就会让操作逻辑内嵌在各个元素中,很难维护和应对变化(牵一发而动全身)。所以,vistor把本来分散在各个元素中的对元素的access逻辑,都提取出来,集中到一个访问者对象中,成为访问者对象的各个访问方法。这是双/多分派(double/multi-dispatch )在不支持多分派的语言(如C++)中的一个实现。
  11. 解释器(Interpreter),没有看出这个模式有什么特别的地方。

最后,提一下,个人认为最常用和重要的两个设计模式:Proxy , Observer。

经典教程GOF设计模式(中文版) GOF23种经典设计模式中文版 学习设计模式的必备书籍 立即下载

相关推荐

GoF的23个经典设计模式

以文本和思维导图的方式简明扼要的介绍了GoF的23个经典设计模式,可当成学习设计模式的一个小手册,偶尔看一下,说不定会对大师的思想精髓有新的领悟。

经典的23种GoF设计模式详解及实用实践

本文采用基于读者日常生活中遇到电商平台业务(比如订单、商品、优惠券、活动、购物车、支付等)来讲解常用GOF23种经典设计模式,内容精练、通俗易懂、实用。读完本文后,会让你觉得原来设计模式在日常编程中原来如此好用,如此简单,并不是什么为了面试需求而要背诵的八股文。

yangzhihua的专栏 1101

深度学习&故障诊断初学者 - 学习路线

针对初学者,一头雾水,不知如何学习,本文给出了一个学习路线 Python学习 - 打好编程基础 https://www.bilibili.com/video/BV1vA411b7Rn?spm_id_from=333.337.search-card.all.click B站免费课程 学到P49 建议时长 2周 深度学习理论 - 浅浅理解神经网络 https://www.bilibili.com/video/BV1FT4y1E74V?p=41 建议时长 2周...............

m0_47410750的博客 6万+

POSA边读边写 — 1

拿到这本书,就感觉POSA是继GoF之后的又一经典之作。序中介绍, POSA拓展了模式的范围,从原来的设计模式,拓展了新的高层次的体系机构模式,和底层的和程序设计语言相关的惯用法模式。 提出了新的模式分类方法 (根据规模/抽象层次) 提出了模式系统,来帮助我们利用模式来设计 什么是模式:模式是一个描述,它描述了一个经过了前人实践充份考量过的解决

道道道 非常道 2803

ENSP Pro VXLAN EVPN分布式网关部署配置

在BGP EVPN方式部署分布式网关的场景中,控制平面的流程包括VXLAN隧道建立、MAC地址动态学习;转发平面的流程包括同子网已知单播报文转发、同子网BUM报文转发、跨子网报文转发。该方式实现的功能全面,支持主机IP路由通告、主机MAC地址通告、主机ARP通告,可以直接使能ARP广播抑制功能。如果在VXLAN网络中采用分布式网关,推荐使用此方式。对比集中式网关,分布式网关的arp条目比集中式网关的arp条目少,分布式网关只学习租户侧的arp条目,不学习网络侧的arp条目。

qq2353177176的博客 4559

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

初读《设计模式之禅》

吕海鹏 in 优快云 Blog 1468

用GraphPad Prism直出单细胞亚群堆叠柱状图

用GraphPad Prism直出单细胞亚群堆叠柱状图

fivehuge的博客 4195

零基础设计模式——总结与进阶 - 3. 学习资源与下一步

设计模式是前人智慧的结晶,是解决特定问题的有效“套路”。学习它们,是为了让我们站在巨人的肩膀上,写出更优雅、更健壮、更易于维护和扩展的代码。但切记,模式是手段,不是目的。真正的目标是构建优秀的软件。希望本教程能为你打下坚实的基础,祝你在软件设计的道路上不断探索,享受创造的乐趣!

qqxhb 资源共享 886

告别调参玄学:用 DINOv2 (ViT-S/ViT-G) 和 PCA 可视化,直观理解自监督特征

本文深入解析了DINOv2(ViT-S/ViT-G)模型在自监督学习中的特征提取机制,通过PCA降维技术实现特征空间的可视化。文章对比了不同规模模型的特征表达差异,并提供了PCA阈值调优和深度分析的实用技巧,帮助读者直观理解自监督学习的视觉密码。

weixin_42565865的博客 410

ConvLSTM时空预测实战代码详解

ConvLSTM代码复现

JaysonWong的博客 1万+

GOF23种设计模式

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

斌哥哥的博客 558

〖Python接口自动化测试实战篇④〗- 接口自动化测试详解

[接口测试] 是相对来说和我们的功能测试 [最为接近的一种自动化测试手段] ,所以我们首先来学习接口测试的内容。 实现接口的开发与接口的测试,在我们的思维上、想法上、面向的态度上都是不一样的。所以大家要有一个思维上的转换,要认识了解一下 接口测试到底是做什么的、它的功能、意义在哪里。...

易编橙 · 终身成长社群,相遇已是上上签! 5万+

POSA 模式集合

按照下面的分类开始着手,写下每一个模式的故事和我自己的理解 1 From Mud To Structure Domain Model Layers Model-View-Controller Presentation-Abstraction-Control Microkernel Reflection Pipes and ...

weixin_30879169的博客 322

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

本文主要介绍了AttributeError: module ‘lib’ has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK’解决方案,希望能对使用python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于POSA v1巨详细读书笔记,请大家多提意见!

 很多地方都不知道该怎么翻译,有的句子,按照原文翻译出来居然和《面向模式的软件体系架构 卷1 模式系统》翻译出来的一样,还有些句子以我的能力是翻译不出来的,有的只能意译了,有的整句都是我自己加上去的。当然错误应该会很多,毕竟没有那么深厚的英语功底。请大家都来帮帮我吧,你要是发现哪里翻译错误,不好,或者句子不通顺,都请提出来,我会尽力修改的。如果能在过程中我和您都能学到更多,那就更好了。谢谢!!

Rhinocerotic Doozer 1104

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

POSA2 导读

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object classid

小白-豆豆的专栏 3193

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 333

访问者模式详解

汇总目录请点击访问:《设计模式目录汇总》 喜欢内容的话欢迎关注、点赞、收藏!感谢支持,祝大家祉猷并茂,顺遂无虞!

2601_96797912的博客 15

Agent Skill 五大设计模式:从工程实践到落地指南

Skill 不是一段临时 Prompt,而是一个可复用、可测试、可迭代的任务流程模板。通常通过SKILL.mdWhen:什么情况下触发How:按什么步骤执行What:最终输出什么:哪些行为必须遵守、哪些行为禁止fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;用户意图Skill 路由工具调用 / MCP / API结构化输出检查与交付。

m0_62458145的博客 203

设计模式之状态模式

状态模式是一种行为型设计模式,通过将对象的不同状态行为封装到独立的状态类中,使上下文对象在状态变化时自动切换行为。以外卖订单为例,不同状态(如待支付、配送中)对同一操作(如取消)有不同响应。状态模式避免了复杂的if/else判断,提升代码可维护性与扩展性。其核心由上下文(Order)、状态接口(OrderState)和具体状态类组成,通过委托机制实现状态间的平滑切换。

FallingGod的博客 139

设计模式速查

本文梳理12个核心设计模式,涵盖创建型、结构型与行为型,提供简洁Java实现与面试要点。重点解析单例(静态内部类)、工厂(方法/抽象)、建造者(链式构建)等高频模式,强调代码可维护性与扩展性,附速记口诀与对比表格,助力开发与面试双提升。

ttlovet的博客 171

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 97

设计模式指南 (Java 版)

设计模式是解决软件设计中常见问题的可复用方案,而非直接代码。本文以最简方式梳理三大类设计模式:创建型(如单例、工厂方法)、结构型(如适配器、装饰器)和行为型(如观察者、策略)。通过生活化类比与Java示例,强调“按需使用、避免过度设计”的原则,帮助理解其核心思想与实际应用。

sync_with_U 219

设计模式与生活⑬:你坐几号线,谁来运营是另一回事

一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不

工一木子 231
上一篇: Wrapper Facads of IPC in ACE
下一篇: POSA边读边写 — 1
zhdaniel
博客等级 码龄21年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值