我学习设计模式的一些所想所得
设计模式一直饱受争议,很多人对设计模式推崇备至,但也有很多人认为设计模式误导了编程者,见(《解密“设计模式”》)。
我也只是一个普通的编程人员,这里只能谈一谈我在学习设计模式中的一些想法,不一定正确,欢迎大家谈论。我对设计模式的理解是分阶段的:
一、这是些什么乱七八糟的东西?那时候听到了设计模式的概念,到图书馆借了一本大概名字叫《设计模式初学者入门》之类的书。书里就把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
我学习设计模式的一些所想所得相关推荐
- 阿里大佬告诉我,想学习设计模式,得先学好这些硬核技能
写在前面 我们继续学习架构师技能,今天是本系列的第二篇,希望大家持续关注. 可能你不是科班出生,甚至大学都没念,没背景没关系.我们只要每天进步一点点,一个月.两个月.半年.一年....... 规划性的 ...
- 小菜学习设计模式(五)—控制反转(Ioc)
写在前面 设计模式目录: 小菜学习设计模式(一)-模板方法(Template)模式 小菜学习设计模式(二)-单例(Singleton)模式 小菜学习设计模式(三)-工厂方法(Factory Metho ...
- 1.4 如何学习设计模式
在了解了设计模式的历史和分类后,应该如何学习设计模式呢?在学习设计模式之前,读者一定要树立一种意识,那就是:设计模式并不只是一种方法和技术,它更是一种思想.一个方法论.它和具体的语言没有关系,学习设计 ...
- 跟着ZHONGHuan学习设计模式--桥接模式
转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...
- [转自左潇龙的博客]设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)...
原文地址: https://www.cnblogs.com/zuoxiaolong/p/pattern26.html 作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本 ...
- 设计模式总结篇(为什么要学习设计模式,学习设计模式的好处)
版权声明:转载必须注明本文转自晓_晨的博客:http://blog.csdn.net/niunai112 在学习完设计模式后,LZ想告诉大家: 对于一名工作不久的程序员来说,学习设计模式是非常有必要的 ...
- 【学习设计模式6】单枪匹马只身一人——单例模式
单例模式是结构最简单的设计模式之一,也是最普遍应用的设计模式之一. 简单但是重要,唯一所以特别. 上篇: [学习设计模式5]创建型模式三结义-抽象工厂模式_Aiky哇-CSDN博客抽象工厂模式是所有形 ...
- 零基础学习设计模式之装饰器模式(配套视频)
零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...
- 浅谈自己学习设计模式的感受
对于开发工作者的世界,不管是开发讨论会上还是学习交流会上,更或者面试的时候,当提及设计模式,都会或多或少的让别人高看你一眼.为什么它会有这么强大的魅力呢! 有些人说,主要是因为设计模式太抽象,不好理解 ...
最新文章
- 有趣的网页注释代码,保护我方源码
- C语言学习总结(四)——数据结构
- 【机器视觉】Qt集成Halcon开发环境详解(二)
- when is oData transaction data request sent for an xml view binding case
- Python打包EXE神器 pyinstaller
- 宏块帧内预测的具体过程
- matlab视频旋转振动,基于MATLAB的振动合成及左旋与右旋的动态模拟演示
- PolkaFoundry等成立Polkadot区块链开发协会(PBDA)
- 推荐系统之美团在CTR模型优化的实践
- FPGA信号处理系列文章——相关与卷积
- DotNet 资源大全中文版(Awesome最新版)
- Exchange 2019反垃圾邮件组件启用反垃圾邮件功能、设置白名单\黑名单
- 错题日志(哈理工热身赛)
- Linux CentOS7 升级内核的方法
- Django Web框架教学笔记-1
- GMap.net在winform中调用高德地图
- nodejs发送邮件
- LINUX基础之 压缩归档篇(二)
- python实现p图软件_这才是Python程序员P图的正确打开方式!
- 用狼的处世哲学做SOHO 二
热门文章
- Citrix XenApp6.5的安装
- 通过多组的HSRP实现网络的冗余和负载
- IIS Log的位置
- gps测速仪手机版下载_银豹收银系统手机版下载-银豹收银系统手机安卓版APP下载v2.0.1.2...
- RocketMQ(十二)消息堆积与消费延迟
- html表单文本转换,HTML表格中的垂直(旋转)文本
- 要重复多少次变成潜意识_新股要申购多少次才能保证一定中签?
- html自动切换文字,JS实现自动切换文字的导航效果代码
- MySQL日期、字符串、数值型转换
- 解决tshark报错:tshark: Some fields aren‘t valid