设计模式一直饱受争议,很多人对设计模式推崇备至,但也有很多人认为设计模式误导了编程者,见(《解密“设计模式”》)。

我也只是一个普通的编程人员,这里只能谈一谈我在学习设计模式中的一些想法,不一定正确,欢迎大家谈论。我对设计模式的理解是分阶段的:

一、这是些什么乱七八糟的东西?那时候听到了设计模式的概念,到图书馆借了一本大概名字叫《设计模式初学者入门》之类的书。书里就把23个设计模式挨个讲了一遍,引用一下每个设计模式的定义,给个类图,配点代码……然后我硬着头皮读完之后,就一个感觉,“脱了裤子放屁”。一个功能,明明很简单、很直接的就能实现,为什么要添那么多的类,绕那么多的弯?记得当时也就懂了“单例模式”。

二、后来又找其他的书,这时候我读到了程杰的《大话设计模式》,其中用活字印刷的例子,讲解了曹操“对酒当歌,人生几何”的敢动,我仿佛一下子就开窍了。明白了设计模式,他最重要的目的就是为了应对“变化”。所以回过头来看,为什么之前能懂“单例模式”,就因为“单例模式”的目标很清晰,所以很好懂;反之,其他的设计模式,目标比较“复杂”,所以我懂不了。

三、但仅仅知道了设计模式的目标,还是没有解决我的疑惑。我记得当时我心里反反复复的一个问题,“有变化,改代码就行了呀。怎么改都是改,为什么就一定要想你(设计模式)说的那样改呢?”那时候我基本上是单兵作战,代码是自己一个人从头写到脚,哪里有问题我就可以改哪里,完全没有心理负担,呵呵。后来工作变动,开始了团队开发、维护别人的代码,以及使用第三方组建。我就自然而然的明白了,有些代码,是你只能用不能改的!典型的就是人家只给你一个已经编译的dll,你怎么改?坑爹呀!所以,那时候,我最先明白的就是Adapter模式,为什么要用Adapter?因为接口不一致,你不使用Adapter就用不了第三方的代码!

四、如果说上面这个阶段是“迫不得已”的使用设计模式,接下来就是我开始主动的思考和使用设计模式了。我有差不多一年的时间都是在维护公司遗留下来的老代码——足以让人崩溃的代码!每一次的bug fix,都不得不小心翼翼、如履薄冰,即使如此,仍然有很多次的改动,都是“按下了葫芦浮起了瓢”。让我充分的意识到什么叫“紧耦合”、“坏味道”,我们会有计划的做一些重构,在这些过程中,我都会主动的思考,能不能套用某种设计模式(但没有一次成功,老大不让,担不起责任呀——系统太老太大太脆弱,你懂的!呵呵)

五、真正的理解设计模式的核心思想。我认为我目前仍然没有达到这个程度,虽然可以随口说出一些耳熟能详的设计原则,“高内聚、低耦合”,“对扩展开放,对修改关闭”,“优先使用聚合”之类的。但理解仍然不深,很多时候觉得这也可那也可,拿不定主意。我觉得这是我代码写得太少的原因,需要在更多的实践中体会提高。

看完这些,你肯定知道,我对学习设计模式是持支持肯定态度的。那么,下面和同学们交流一下学习设计模式的方法吧。

一、实践。记得金旭亮老师曾经说过,“没有写过10万行代码,不要谈设计模式”,可能有点夸张,但道理是棒棒的。比如我,如果没有不得不深入到那些足够复杂足够混乱的代码,身心饱受摧残,不可能对设计模式的认识有质的提高。因为设计模式的一个重要应用场景,是应付那些复杂的业务逻辑、快速的需求变化,她的价值在这些地方,才能够清晰的体现出来。“坐而论道”是一种我们都期望的“懒人模式”,但估计很难有效——至少对于我这种资质平庸的人来说吧。

二、明白设计模式的目的。每一个设计模式,一定是要解决一定的问题的;并且解决这些问题是附带了条件的。比如,需求发生了变更,这是问题。如果没有其他约束,解决这个问题的办法很简单,就是改代码而已,加上一个if...else而已。但是,我们不能这些改!(理解这一点相当重要,切记切记。当然,你可能会问,为什么不能这么改呢?我们下面再说)我们不能修改类里面的代码,我们只能采取一些其他手段,比如继承、比如封装原有类,来实现新需求。这时候,设计模式就粉墨登场了。

三、上面所说,为什么不能直接改类里面的方法函数,比如直接加if...else?我们可以从两方面理解。一方面是“被动的”,比如我们是引用的一个编译了的dll,根本就改不了;或者是团队开发,别人不允许你改他们写好的类。另一方面是“主动的”,接前面“团队开发,别人不允许你改他们写好的类”,为什么他们不允许你改呢?是不是他们固执、偷懒,没有团队精神?你把官司打到大BOSS那里,可能会被一顿K。你需要仔细的体会,“类”的概念。类就是一种封装,封装就意味着拒绝修改——想一想为什么会有private关键字吧。好了,就不在这里展开了,不然又要写一本书了。你只需首先明白,设计模式,是一种“带着脚镣的舞蹈”;然后进一步思考,为什么需要这些脚镣即可。(当然,如果你够牛B,这些最终砸碎这些脚镣,不在此探讨范畴)

最后,我还是强调“实践”,如果想要更好的理解第二条、第三条,唯一有效的方法,可能就是实践了(前提是你已经或多或少的研究过设计模式了)。

转载于:https://www.cnblogs.com/freeflying/archive/2013/03/07/2948194.html

我学习设计模式的一些所想所得相关推荐

  1. 阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能

    写在前面 我们继续学习架构师技能,今天是本系列的第二篇,希望大家持续关注. 可能你不是科班出生,甚至大学都没念,没背景没关系.我们只要每天进步一点点,一个月.两个月.半年.一年....... 规划性的 ...

  2. 小菜学习设计模式(五)—控制反转(Ioc)

    写在前面 设计模式目录: 小菜学习设计模式(一)-模板方法(Template)模式 小菜学习设计模式(二)-单例(Singleton)模式 小菜学习设计模式(三)-工厂方法(Factory Metho ...

  3. 1.4 如何学习设计模式

    在了解了设计模式的历史和分类后,应该如何学习设计模式呢?在学习设计模式之前,读者一定要树立一种意识,那就是:设计模式并不只是一种方法和技术,它更是一种思想.一个方法论.它和具体的语言没有关系,学习设计 ...

  4. 跟着ZHONGHuan学习设计模式--桥接模式

    转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...

  5. [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...

    原文地址:    https://www.cnblogs.com/zuoxiaolong/p/pattern26.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本 ...

  6. 设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)

    版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 在学习完设计模式后,LZ想告诉大家: 对于一名工作不久的程序员来说,学习设计模式是非常有必要的 ...

  7. 【学习设计模式6】单枪匹马只身一人——单例模式

    单例模式是结构最简单的设计模式之一,也是最普遍应用的设计模式之一. 简单但是重要,唯一所以特别. 上篇: [学习设计模式5]创建型模式三结义-抽象工厂模式_Aiky哇-CSDN博客抽象工厂模式是所有形 ...

  8. 零基础学习设计模式之装饰器模式(配套视频)

    零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...

  9. 浅谈自己学习设计模式的感受

    对于开发工作者的世界,不管是开发讨论会上还是学习交流会上,更或者面试的时候,当提及设计模式,都会或多或少的让别人高看你一眼.为什么它会有这么强大的魅力呢! 有些人说,主要是因为设计模式太抽象,不好理解 ...

最新文章

  1. 有趣的网页注释代码,保护我方源码
  2. C语言学习总结(四)——数据结构
  3. 【机器视觉】Qt集成Halcon开发环境详解(二)
  4. when is oData transaction data request sent for an xml view binding case
  5. Python打包EXE神器 pyinstaller
  6. 宏块帧内预测的具体过程
  7. matlab视频旋转振动,基于MATLAB的振动合成及左旋与右旋的动态模拟演示
  8. PolkaFoundry等成立Polkadot区块链开发协会(PBDA)
  9. 推荐系统之美团在CTR模型优化的实践
  10. FPGA信号处理系列文章——相关与卷积
  11. DotNet 资源大全中文版(Awesome最新版)
  12. Exchange 2019反垃圾邮件组件启用反垃圾邮件功能、设置白名单\黑名单
  13. 错题日志(哈理工热身赛)
  14. Linux CentOS7 升级内核的方法
  15. Django Web框架教学笔记-1
  16. GMap.net在winform中调用高德地图
  17. nodejs发送邮件
  18. LINUX基础之 压缩归档篇(二)
  19. python实现p图软件_这才是Python程序员P图的正确打开方式!
  20. 用狼的处世哲学做SOHO 二

热门文章

  1. Citrix XenApp6.5的安装
  2. 通过多组的HSRP实现网络的冗余和负载
  3. IIS Log的位置
  4. gps测速仪手机版下载_银豹收银系统手机版下载-银豹收银系统手机安卓版APP下载v2.0.1.2...
  5. RocketMQ(十二)消息堆积与消费延迟
  6. html表单文本转换,HTML表格中的垂直(旋转)文本
  7. 要重复多少次变成潜意识_新股要申购多少次才能保证一定中签?
  8. html自动切换文字,JS实现自动切换文字的导航效果代码
  9. MySQL日期、字符串、数值型转换
  10. 解决tshark报错:tshark: Some fields aren‘t valid