给设计模式说句公道话

Flash的破解与加密 包括:SSD4,换衣.zip,flash.zip  在一些名门论坛,谈论破解之术被明文禁止甚至会招来不尽的鄙视。笔者一直都对这个观点有种很异样的感觉。诚然,尊重原创是一种美德。然而对于不会说话的工具而言,其本身又岂会有善恶之分?有善恶之分的,是使用这些工具的人。  因为无法控制其 阅读详情

这两天有同学和我聊到了设计模式的问题, 其中一位同学说: 我自学Java ,已经学了封装、继承、多态,也看了设计模式, 但是我发现在编程中根本就用不到啊。


还有一位对设计模式非常不屑: 这是过度设计的代表, 纯属脱裤子放屁,多此一举。

这些对设计模式的看法要么是过激,要么是对设计模式不太了解, 我觉得有必要写个文章,一是给设计模式说句公道话。 二是给大家分享下我学习设计模式的经过。

其实不管你承认不承认, 设计模式已经变成了面向对象编程语言(尤其是Java)的DNA, 一个你绕不过去的门槛。


我可以大胆地预言一下: 只要面向对象的编程范型没有消亡, 只要还在用OO编程,那设计模式就不会过时。

设计模式是什么东西? 简单来讲就是久经考验的、在面向对象设计领域的成功经验的总结。

世界上第一个面向对象的语言Simula在上个世纪70年代就诞生了,70年代产生了更具影响力的SmallTalk,  后来是C ++, Java, C#...... 发展了这么多年, 你可以想象有多少应用被开发出来, 这中间有多少血和泪的教训。

有些人踩了一个坑, 挣扎着爬了上来, 拍怕身上的尘土,挥一挥衣袖, 不带走一片云彩。

有的人则更加有心, 会在那里立上一个牌子: “注意啊,当你看到周边环境出现XXX情况的时候,就说明这里有个坑,可以用XYZ的办法来解决。”

这样的牌子立得越来越多,终于有几个大师跳出来说: 好吧, 是时候对这些牌子做一下分类总结了,我们给这些牌子起个有意义的名称, 这个叫 “工厂方法”, 那个叫“装饰者”......  ,   于是设计模式诞生了。

既然是经验总结,这么好的东西, 为什么初学者感受不到他的好处呢?

我想起来自己刚刚接触设计模式的时候,当时模式的概念进入中国没多久,大家奉若神明,见面不谈模式简直都不好意思和人打招呼。 

 

于是我也赶紧去海淀图书城买一本设计模式的书, 没错,就是“四人帮”写的经典书:

0?wx_fmt=jpeg0?wx_fmt=gif

然后忍受着中文翻译,开始拜读,读完以后的感受是: 嗯,大师的教诲,确实是看不懂啊。

书中举的例子大部分都是很“高冷”的文字编辑器相关的, 和我们这些程序员的日常工作相距较远。由于缺乏切身的体会,这设计模式似乎是隔着一层纱,模模糊糊地能感觉到它的存在, 但是却看不清楚。

有一次吃饭的时候给组长安利设计模式,吹牛说设计模式就是面向接口编程而不是面向实现编程,优先使用组合而不是继承, 发现变化并且封装变化。 -- 其实我当时并没有体会到这种思想,就是记住了而已。 

组长说:这确实是面向对象编程的精髓, 这么好的东西,你可以在项目中用一下啊。


我奉命去项目实战,使出了洪荒之力, 用C++写了一个Iterator出来,高兴得不得了。

组长说: “嗯? 你为什么不用for 循环来遍历? ”

我以为组长不懂:“ 我实现的可是大名鼎鼎的Iterator啊”

“我不管你用什么模式, 但是这就是一个对数组的遍历,在可见的未来,这个数组作为数据结构也不会变化,  为什么再封装一层呢?”

我意识到掉进了另外一个坑里: 为了使用而使用, 完全不考虑Iterator模式要解决的问题 : 提供一种方法访问一个容器对象中各个元素,而又不需暴露该容器的内部细节。

于是我就把设计模式给搁置下来了。

过了一阵子我要写一个在浏览器中运行的Java Applet程序, 需要通过网络访问后台的铁路信息系统,这样的网络访问代码很多,还要处理对象的序列化问题, 这些非业务代码反客为主,把Applet中正常的业务代码搞得凌乱不堪。

当时我就想到,这是位于两个地址空间的程序在通信, 要是那个Applet能像访问本地java方法一样去使用那些接口该多好 !

苦思冥想以后,终于想到了一个设计: 可以做个代理对象,对Applet提供接口, 内部封装网络访问代码和序列化代码, 把请求发送给后台的铁路信息系统系统处理。

0?wx_fmt=png

0?wx_fmt=gif

有了这个代理,把繁琐的、易于变化的细节都封装了起来,Applet中的代码简化了很多, 可以真正地专注业务了。

转念一想,咦, 自己千辛万苦、苦思冥想出的设计方法,不就是设计模式中Proxy模式思想的体现嘛! 原来这才是设计模式啊 !

前辈们早就碰到过坑,已经在这个坑旁边树立了一个牌子:

“远程代理( Remote Proxy )为 一 个 对 象在 不 同 的 地 址 空间 提 供 局 部 代 表。NEXTSTEP[Add94] 使用N X P r o x y类实现了这一目的。Coplien[Cop92] 称这种代理为“大使”(A m b a s s a d o r)。 ”

(微信公众号码农翻身注: 这个NEXTSTEP可是上个世纪80年代,乔布斯被从苹果扫地出门后搞出的操作系统,实在是太古老了,所以不会引起读者的注意。  不过考虑到这本书的是1994年出版的, 也就不足为怪了。)

这个牌子我在看书的时候只是瞥了一眼, 没有深刻体会而已。  我对设计模式感觉模模糊糊的,正说明我在面向对象设计方面是个菜鸟。


多年以后,再回过头去看这个经典书,对于之前根本不在乎的文字却能产生共鸣,充分说明了经验的增长。

后来我就看各种开源的代码实现,陆陆续续接触到模板方法,Command模式,组合模式,工厂方法...... 加深了对设计模式的理解,慢慢的体会到了模式的优雅之处。

对我个人来讲,学习设计模式经历了这么三个阶段:

1.  囫囵吞枣,建立初步印象

2.  在实践中有意或无意的使用设计模式,读开源代码加深体会

3.  忘掉设计模式,把设计模式的思想内化, 变成自己设计方法的一部分。 -- 还在努力修炼中

对于程序员来说,学习设计模式,最重要的是学习它背后的思想,努力地体会设计模式是怎么在一个场景下去解决问题的。 


刚开始搞不明白也没什么大不了的,学习本来就是螺旋上升的过程,努力地思考,总有顿悟的一天。


最后再重复一遍模式背后的思想吧:

面向接口编程而不是面向实现编程

优先使用组合而不是继承

发现变化并且封装变化

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身2016文章精华》或者《码农翻身2017上半年文章精华》

有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577


码农翻身

用故事讲述技术

0.jpeg

【侯俊霞全网最全收集--PLC1200/200SMART(88+93课时) 第1章】 第1章:零基础快速入门西门子S7-1200 阅读详情

相关推荐

sap外币重估流程图_SAP 外币评估方法(Valuation Method,评估方法)

在FI-GL模块评估外币时(T-code:F.05),需要输入ValuationMethod。下面分解一下评估方法是如何定义的。IMG -> FI -> General LedgerAccounting ->Business Transactions ->Closing ->Valuating -> ForeignCurrency Valuation ->...

weixin_39640543的博客 2356

设计模式三重天[之三]

写作背景:        一直在看关于设计模式的书并不断的实际工作中努力实践,同时也看到了播客园上设计模式团队文章热火朝天的研究和讨论。心里非常高兴,在国内设计模式的研究和使用还不是很丰富和完善的今天,这种讨论无疑会对每个园中的个体还是播客园整体实体的提升有着重大的意义,我非常希望以后想研究.NET程序的人只要知道两个网址就能完成工作中90% 的知识查询,一个是微软的MSDN,一个就是播客园。...

weixin_34302561的博客 142

具身智能的边缘计算核心构成方案

摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠

老郑的博客 812

设计模式(注重理解为什么),

设计模式单例模式,策略模式单例模式常见问题 单例模式,策略模式 定义: 单例模式常见问题 内容为headfirst 设计模式. 其他待学:

热干面 2479

从零构建智能监控系统:ZLMediaKit与SpringBoot的RTSP流处理实战

本文详细介绍了如何从零构建智能监控系统,结合ZLMediaKit与SpringBoot实现RTSP流处理。通过多协议支持、高性能架构设计及工业级部署优化,解决传统监控方案的兼容性差、延迟高等问题,适用于物联网和智能安防领域。

weixin_29002209的博客 370

从零到一:在RK3588 Android12上实战RTL8723DU WiFi蓝牙双模驱动移植

本文详细介绍了在RK3588 Android12系统上实战RTL8723DU WiFi蓝牙双模驱动移植的全过程。从驱动源码获取与修改、系统级集成与编译,到调试与性能优化,提供了完整的解决方案。特别针对USB接口适配、电源管理和蓝牙共存等关键问题给出了具体代码示例,帮助开发者快速完成驱动适配并提升设备稳定性。

weixin_28703489的博客 326

一句话总结23种设计模式

1. 前言 断断续续写了一段时间的设计模式,终于把经典的23种设计模式全写完了。下面对这些设计模式总结一下。 2. 设计原则 设计原则的介绍 : 设计模式的六大原则 即使我们之前没有专门看过这些原则,但是我们实际开发中或多或少都用到这些原则。实际上,这些原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性、可维护性。优秀的设计模式就是基于这些原则去实现的。 3.

四月葡萄的博客 813

rk3399 hdmi HDCP key烧录

1.key转换 使用 hdcp\ProvisioningTool_20170526\KeyConverterV2.02 目录下的KeyConvertor.exe工具将1.4key进行转换 转换后得到 TX00000001.skf 文件,将 TX00000001.skf 文件烧录到开发板上,烧录方式: 打开文件 hdcp\ProvisioningTool_20170526\ProvisioningTool20170526\ProvisioningTool.exe 选择烧录方式与烧录路...

qq_32645109的博客 3859

关于设计模式的几点误区

现在的设计模式越来越火,很多人动不动就说设计模式,好像设计模式无所不能,使用了设计模式的程序就好像拥有了无上的法力。本人见到很多的人在自己的博客中详细的讲解各种设计模式的使用场景和使用方法。本人觉得这些文章虽然给不了解设计模式的人员加深理解和学习的机会,但是同时也给更多的初学者一种误区!下面就来详细的说明这些误区:一、过度设计设计模式提倡的是面对变化,产生变化时能够对变化及时的进行修改

tolly2007的专栏 594

大模型的安全发展与安全治理

2022 年底,OpenAI 推出的 ChatGPT 在文本生成领域实现了重大突破,引领了大模型技术的发展方向,推动了各式各样的基座大模型及行业大模型的发展,并逐步向多模态和具身化方向迅速演进。显然,大模型展现出的强大能力为人工智能通用化揭开了序幕。然而,大模型技术的安全性也面临着生成内容的安全性、伦理道德等重大挑战。只有积极确保大模型的安全性,才能更有效地推动其持续发展,进而更好地应对大模型技术变革所带来的机遇与挑战。

qq_41432686的博客 2583

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采集到的数据进行处理和解算,上层用户交互层负责与用户进行交互并显示系统状态信息。

嵌入式阿齐Archie 1万+

运用多种设计模式的综合案例,有人可以给我一个过度使用的设计模式的例子吗?...

I've been hearing and reading about cases when people had come across cases of overused design patterns. Ok, missused design patterns are understandable phenomenon. What does it actually mean overused...

weixin_31887421的博客 189

016、自动标注方案实战:用大模型(SAM/Grounding DINO)生成 YOLO 格式伪标签

本文介绍了一种利用大模型自动生成YOLO格式伪标签的实战方案。针对传统人工标注效率低、易出错的问题,作者提出结合Grounding DINO(零样本检测)和SAM(精细分割)的优势:前者快速生成候选框,后者优化边界精度。文章详细阐述了技术选型理由(平衡速度与精度)、环境搭建避坑指南(关键依赖版本)、核心三步流程(检测-分割-格式转换)以及后处理技巧(置信度分级过滤)。实验表明,该方案相比纯人工标注可节省80%时间,且经过SAM优化的边界框精度提升10-15%。特别强调了工程细节:文本描述格式、阈值设定、小目

zzfmlxs的博客 544

为Java说句公道话

有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。 Java超越了所有咒骂它的“动态语言” 也许是因为年轻人的逆反心理,人们都不把自己的入门语言当回事。很早的时候,计算机系的学生用Scheme或者Pascal入门,现在大部分学校用Java。这也许就是为什么很多人恨Java,瞧不起用Java的人。提到Java,感觉就像是爷...

weixin_30726161的博客 74

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

随便扯扯东北师大的面试

昨天跑到东北师大招聘会面试, 一位面试官问我:"说说C#中的属性, 严格来讲应该是特性" 东北师大昨天有个大型的招聘会, 今天吉大有, 今天的这个我没去, 说说昨天的经历吧。总的来说吧, 计算机的方面的真多, 我同学还听见有人尴尬说, 当初学计算机就好, 找工作也不会这么愁了, 作为计算机的, 说句公道话, 计算机专业的就是找工作的时候机会多而已, 但是走技术路线要求也是很高的, 先不...

anfeng4628的博客 205

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java日经问题总结

本文旨在快速解决常规,常见,常识的三常问题 1,Mybatis二级缓存相关 深入了解MyBatis二级缓存-逆流而上 -----又名二级缓存从了解到放弃 Spring Cache简单介绍和使用-----正儿八经的缓存方案 Spring Cache+Redis实现自定义注解缓存-----新手参考demo ...

学医救不了中国人 5772

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

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

程序员的五种境界

境界一:混沌态、浆糊状(小白、新兵)  刚刚毕业、初出茅庐,无任何项目经验。典型台词:“哇塞,薯熟你居然能写出这样这样酷的程序啊”。此时身为薯熟的你切不可信以为真,因为任何简单的程序对他们来说……其实都是写不出来的。技能:helloworld!经验:0年角色:新手村游荡者(虽然ID很酷,但改变不了时常被怪虐的事实)境界二:CODESMELL(IT民工)对于一些不太残忍的需求,竟已经能够完成了!了不...

weixin_33774883的博客 94

告别2017,码农翻身全年文章精华

时间过得真快,转眼间2017年就结束了!感谢大家一年来的陪伴、支持和鼓励!这里是2017年全年码农翻身文章精华, 点击标题阅读, 欢迎转发分享。如果觉得不过瘾的话,一定...

码农翻身 606

Flash破解与防破解(转载)

也谈Flash破解与防破解在一些名门论坛,谈论破解之术被明文禁止甚至会招来不尽的鄙视。我一直都对这个观点有种很异样的感觉。诚然,尊重原创是一种美德。然而对于不会说话的工具而言,其本身又岂会有善恶之分?有善恶之分的,是使用这些工具的人。因为无法控制其中的尺度,只好一尽排斥,这是中国官方乃至国际官方一惯的作风。言论自由成为人人崇尚却又时时为其所害的一面幌子。自由,也有度。破解和防破解是必将

fjgysai的专栏 2928

为什么总是有人在说现在Java要求越来越高?原因到底是什么?

老是听到xxx要求越来越高的声音,其实回顾多年的职业生涯,作为经常当面试官的我,出来说句公道话,其实大厂技术招聘层面的要求一只就在那里,对核心技能的要求并没有太大的改变。 可能你要反驳分布式、高并发、多线程,spring boot 、 spring clould 、Hadoop、Spark等等技术层出不穷,作为新晋的开发者必须跟上云云。请你先冷静下,这些技术名词,更多要求的是术的层面而非道的层面。接下来我们就面试时对java研发工程师的要求来掰扯掰扯,看看到底是要求变高了,还是一直一来达不到要求的人太多。

weixin_46898270的博客 325

程序员的境界

境界零:混沌态、浆糊状(小白、新兵)                   刚刚毕业、初出茅庐,有丰富把妹经验,无任何项目经验。 典型台词:“哇塞,薯熟你居然能写出这样这样酷的程序啊”。 此时身为薯熟的你切不可信以为真,因为任何简单的程序对他们来说 ……                  其实都是写不出来的。 技能:hello world! 经验:0 年

421

史上最全的开源项目创作指南

前言 开源,是这个时代的主旋律。作为一名Android开发工程师,我有理由相信我们是开源的最大受益者,因为那个养活我们的Android其本身就是Google的开源项目。在这样一个开源的时代,就连之前那个最排斥开源的"微软"也不得不积极拥抱开源,大手笔收购github以表自己的开源决心。 前段时间我在逛github的时候,偶然间发现,我的github已经拥有12个star过百的开源项目,2个star过千的项目。回首一想,原来我做开源项目已经快3年了,想想这一路走下来真的非常不易。 深夜和周末是我做开源项

xuexiangjys的博客 5838

SWF加密

※序言※在一些名门论坛,谈论破解之术被明文禁止甚至会招来不尽的鄙视。我一直都对这个观点有种很异样的感觉。诚然,尊重原创是一种美德。然而对于不会说话的工具而言,其本身又岂会有善恶之分?有善恶之分的,是使用这些工具的人。因为无法控制其中的尺度,只好一尽排斥,这是中国官方乃至国际官方一惯的作风。言论自由成为人人崇尚却又时时为其所害的一面幌子。自由,也有度。破解和防破解是必将同时存在的对立体。如同制造病毒和防范病毒一样。因为制造病毒的言论从不会公开出现在一些名门场合,所以每当病毒来袭,防范的一方总是措不及防。这是当

txiejun的专栏 3048
上一篇: 一个故事讲完https
下一篇: javascript王国的一次旅行,一个没有类的世界怎么玩转面向对象?
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值