当前位置: 首页 > news >正文

设计模式 - 总结篇

 

一个月下来,把常见的20个设计模式好好复习并且逐个用C++实现了一遍,收获还是很大的,很多东西看上去明白了但是真正动手去做的时候发现其实还是不明白--我深知这个道理,于是不敢怠慢,不敢写什么所谓的解释原理的伪代码,不敢说所谓的"知道原理就可以了"....因为我知道,我还还没有资格说这个话,至少对于设计模式而言我还是一个初学者,唯有踏实和实干才能慢慢的掌握到知识.

在我学习设计模式的过程中,觉得造成理解困难的主要是以下几点,谈一 下自己的体会,希望对他人有帮助,不要走上我的老路上,毕竟我花了N长的时间 才敢号称自己入门了~~!!-_-: 

1)Gof并不适合于初学者.初学设计模式的一般都是从Gof入门开始学习的,不幸的是,这不是一本好的教科书,而把这本书称为一本奠定了设计模式理论基础的开山之作也许好一些,它把这些散落在各个设计中的常见模式收集起来,从此开始有了一个名词叫做"Design Pattern".说这本书不是一本好的教科书主要是以下的几个原因:

a)对设计模式或者说面向对象里面的一些原则性的东西解释的不够多不够彻底,比如"面向接口编程而不是对实现编程","优先采用组合而不是继承"等等,以至于后面看到各个模式的实现的时候很多模式看起来很相似却找不到区别和共性的地方.

b)对各个模式的解释或者举出来的例子不是特别的好,大部分都是为了讲解模式而讲解,没有加入前面提到过的一些基本原则的考量在里面,也就是说:原理性的东西和实现(各个设计模式)脱节.

2)初学者对语言或者说一些概念理解的不好.拿C++来说,为了做到面向对象需要提供的语言上的支持有继承,多态,封装,虚函数,抽象等等,我以前初学C++的时候,只为了学这些概念而去学习,不知道为什么要提供这些特性,这也是造成我走弯路的重要原因之一.当然,指望一个初学者在初学语言的时候就知道why是一件很困难的事情,也许结合着对设计模式的理解可以帮助你消化这些概念(我就是这样的).

3)看不懂UML结构图和时序图,UML图解释的类与类之间的关系,时序图 解释的是各个对象的实现方式,两者结合在一起看才能加深对设计模式的理解, 事实上,我现在已经可以做到仅仅看这两个图示就掌握一个模式的原理和实现了.

4)写的代码和参与过的项目不够多.设计模式和很多东西的产生过程都是一样的,首先人们遇到了问题,然后很多人解决了这个问题,于是渐渐的有人出来总结出解决这些问题所要遵守的一些原理和常用方法(我们称之为"模式"),久而久之就形成了一个理论或者说一个学科.而后人在讲述这些理论的时候大都是照本宣科,这对于计算机这样一个强调实践的学科或者说对于设计模式这样一个理论而言要理解起来是很困难的.前人在提出这些理论的时候一些考量,权衡等等只有在你自己遇到了这些问题的时候才能慢慢的体会.有一种说法是,没有写上10W行代码不要空谈什么设计模式大概就是这个意思吧.

综上所述,造成初学者学习设计模式困难的原因,一个是对基本的原则理解的不够透彻,一个的选的入门教材不合理,还有一个就是对各个模式的表述不明白,再次是实践不够多.有几本书籍,我看过,我想可以谈谈我的看法.第一本,<<敏捷软件开发:原则,模式与实践>>,这本书对于设计模式最大的贡献在于专门有几个章节讲述了面向对象的几个原则,比如Likov原则,开放封闭原则等等的,这几个章节在我学习设计模式的过程中起了关键的作用,因为当我理解了这些原则之后开始慢慢明白为什么要有纯虚函数提供接口,为什么要

有抽象基类,为什么要封装....我开始用这些原则去理解各个设计模式,开始慢慢 体会各个模式的区别和共性. 另外看过的两本书,我觉得性质都一样,如果你缺钱,任选其一吧.第一本是 <<设计模式精解>>,第二本是<<深入浅出设计模式>>,都是我花上几个晚上  就可以看完的书.这两本的立足点都是以生动的例子结合面向对象的基本原理来 讲解模式,我更喜欢前者一些(后者太贵,要不是打5折我才不买呐:) 其次,要多接触项目或者可以找一些好的代码来看看,自己也多写一些代码. 基本上,只要是用面向对象的语言开发的项目,里面没有几个模式的运用是不可 能的了.因此,要戒除那些一开始接触设计模式就想整明白的幻想,因为要真正的 理解需要很多的实践,同样的一时半会理解不了的也不必气馁(GOF的E文版我 看了好多遍了:),坚信自己多实践一定可以慢慢的悟道的. 关于设计模式的一个疑问:非面向对象语言中有没有所谓的"设计模式"?设 计模式最初的定义是解决一些问题的惯用方法(大意如此),并没有明确的说必须 要支持某种特性的语言.我用纯C开发的项目实在是有限,平时也只是自己作一 些小东西玩玩,没有做过任何一个上万行的纯C开发的项目,所以一直对这个问 题抱有疑问~~anyway,有问题是好事,说明我在思考~~把这个问题放在这里, 以后慢慢实践之琢磨之~~

 

转载于:https://www.cnblogs.com/whiteyun/archive/2010/12/05/1897026.html

相关文章:

  • mysql 案例~select引起的性能问题
  • 研究NIO时的柳暗花明
  • 多余空格,转换空格
  • [Oracle][Metadata]如何查找与某一个功能相关的数据字典名
  • 调试利器--VS2010(有图有真相)
  • MongodbTemplate的增删改操作
  • Exchange2003升级至Exchange2007
  • 第十九、二十周作业微职位
  • Linux命令(十一)——Shell程序设计二(循环控制语句)
  • 现代软件工程 M1 博客要求
  • nodejs上使用sql
  • 3DS Max的单位设置
  • 默认标签解析
  • 数据库书上概念摘抄
  • c#中取整,向上取,向下取
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • $translatePartialLoader加载失败及解决方式
  • fetch 从初识到应用
  • httpie使用详解
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JavaScript 一些 DOM 的知识点
  • JS字符串转数字方法总结
  • Service Worker
  • zookeeper系列(七)实战分布式命名服务
  • 爱情 北京女病人
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 网络应用优化——时延与带宽
  • 用mpvue开发微信小程序
  • 栈实现走出迷宫(C++)
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​第20课 在Android Native开发中加入新的C++类
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $L^p$ 调和函数恒为零
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)JAVA使用POI操作excel
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (四) 虚拟摄像头vivi体验
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)80c52学习之旅-起始篇
  • (一)Dubbo快速入门、介绍、使用
  • (一)kafka实战——kafka源码编译启动
  • (转)母版页和相对路径
  • .naturalWidth 和naturalHeight属性,
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Project Open Day(2011.11.13)
  • .NET 分布式技术比较
  • .NET 服务 ServiceController
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians