王大虎

王大虎:如何阅读本书

王大虎

首先声明,本书中所有的例子都是用Java语言来实现的,但是你可以随手翻翻看,基本上能保证每X语句一个注释,可以说是在用咱们的母语讲解设计模式。即使你不懂Java语言,也没有关系,只要知道在Java中双斜杠(//)代表注释就足够了,况且Java如此强大和盛行,多了解一点没有坏处。类图看不懂?没关系,不影响你理解设计模式,多看看就懂了!

如果你还没有编程经验,我建议你把它当作小说来看,懂行的看门道,不懂行的看热闹,这里的热闹足够多,够你看一壶的了。你现在能看懂多少是多少,不懂没有关系,你要知道,经验不是像长青春痘一样,说长就长出来了,它是需要时间积累的,需要你用心去感受,然后才能明白为什么要如此设计。

如果你已经对编程有感觉了(至少2年开发经验),我相信你都能看懂,但能“懂”到什么程度,就很难说了,看你的水平了。但是,我可以保证,这里的设计模式都是你能看懂的,没有你看不懂的!我建议你通读这本书,然后挑门你最得意的编程语言,动手写吧!给自己制定一个计划,每天编写一段代码,不需要太多,200行足够,时不时地把设计模式融入到你的代码中。甭管是什么代码,比如你想编写一个识别美女图片的程序,好呀,抓紧时间去写吧,写好了就不用到处看美女了,程序一跑就把网上的美女图片都抓过来了,牛呀(记住,程序写好了要分享给我)。看吧,坚持下去,一年以后你再跟你的同侪比较一下,那差距肯定不是一般的大。

如果你是资深工程师、架构师、技术顾问等高等级的技术人员,那我告诉你,你找对这本书了。系统架构没有思路?没有问题,看看扩展部分,它会开阔你的思路。系统的维护成本居高不下?看看本书,设计模式也许能帮你省点银子。开发资源无法保证?设计模式能让你用有限的资源(软硬件资源和人力资源)设计出一个优秀的系统。项目质量参差不齐,缺陷一大堆?多用设计模式,它会给你意想不到的效果。给人讲课没有素材?没问题,本书中的素材足以让你赢得阵阵掌声!

编程是一门艺术活,我有一个同事,能把类图画成一个小乌龟的形状,天才呀!作为一位技术人员,最基本的品质就是诚实,“知之为知之,不知为不知,是知也”,自己不懂没有关系,去学,学无止境,但是千万不要贪多,这抓一点,那挖一点,好像什么都懂,其实什么都不懂。中国一直推崇复合型人才,我不是很赞成,因为这对年轻人来说是一个误导。先精一项技术,然后再发散学习,先点后面才是正道。

王大虎

记得《武林外传》中有这样一段对话:

刑捕头:手中无刀,心中有刀。

老白:错了,最高境界是手中无刀,心中也无刀。

体验一下吧,我们的设计模式就是一把刀,极致的境界就是心中无设计模式,代码亦无设计模式——设计模式随处可见,俯拾皆是,已经融入软件设计的灵魂中,这才是高手中的高手,简称高高手。

哦,最最重要的忘记说了,请把附录中的“23种设计模式附图”撕下来,贴在你的办公桌前,时不时地看看,也让老板看看,咱是多么地用心!

 

 

关于书名

王大虎

乍一看,书名和内容貌似不相符呀,其实不然!

在我们的常规思维中,“禅”应该是很高深的东西,只可意会,不可言传。没错,禅宗也是如此说。禅是得道者的“悟”,是不能用言语来表达的,但是得道者为了能让更多的人“悟”,就必须用最容易让人理解的文字把自己的体会表达出来。本书的“禅”是作者对设计模式的“悟”,本书的“形”就是你现在看到的这些极其简单、通俗、易懂的文字。

至此,大家应该不会再对书名有疑虑了吧,嘿嘿。

 

 

致谢

王大虎

本书的写作耗时7个月,可以说是榨干了海绵里所有的水——基本上能用的时间都用上了。在公交车上打腹稿,干过!在马桶上查资料,干过!在睡梦中思考案例,也有过!就差没有走火入魔了!

首先,感谢杨福川编辑,没有他的慧眼,这本书不可能出版。其次,感谢妻子和儿子,每天下班回到家,一按门铃,儿子就在里面叫:“我来开门,我来开门。”儿子三岁,太调皮了,他不睡觉我基本上是不能开写的,我一旦开始写东西,他就跑过来问:“爸爸,你在干什么呀”,紧接着下一句就是“爸爸,你陪我玩”,基本都是拿我当玩具,别的小朋友都是把父亲当马骑,他却不,他把我当摩托车骑,还要加油门,发动……小家伙脚太重了,再骑摩托,非被他踩死不可!

再次,还要感谢《Spring技术内幕——深入解析Spring架构与设计原理》的作者计文柯先生、《冒号课堂:编程范式与OOP思想》的作者X先生、《Spring揭秘》的作者X强先生、《GWT揭秘》的作者徐彬先生,他们专业、细致、耐心的审核使得本书更加完美,特别是X先生,虽言语不多,但言必中的,受益匪浅。非常X能获得他们四位的指导!

最后要感谢我的朋友王骢,周末只要小家伙在家,我只有找地方写书的份儿,王骢非常爽快地把钥匙给我,让我有一个安静的地方写书。一个人沉浸在自己喜欢的世界里也是一件非常幸福的事。

当然,还要感谢JavaEye上所有顶帖的网友,没有你们的支持我就失去了写作的动力,就像希腊神话中的巨人安泰失去了大地的力量一样,是你们的回帖让我觉得不孤单,让我知道我不是一个人在战斗!

最后,再次对本书中可能出现的错误表示歉意,真诚地接受大家轰炸!如果你在阅读本书时发现错误或有问题想讨论,请发邮件给我。

我的邮箱:cbf4life@126.com。

王大虎
王大虎

 

第一部分 大旗不挥,谁敢冲锋——6大设计原则全新解读

王大虎

第1章 单一职责原则

第2章 里氏替换原则

第3章 依赖倒置原则

第4章 接口隔离原则

第5章 迪米特法则

第6章 开闭原则

 

 

第1章 单一职责原则

 

1.1 我是“牛”类,我可以担任多职吗

 

单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。这个设计原则备受争议,只要你想和别人争执、怄气或者是吵架,这个原则是屡试不爽的。如果你是老大,看到一个接口或类是这样或那样设计的,你就问一句:“你设计的类符合SRP原则吗?”保准对方立马“X”掉,而且还一脸崇拜地看着你,心想:“老大确实英明”。这个原则存在争议之处在哪里呢?就是对职责的定义,什么是类的职责,以及怎么划分类的职责。我们先举个例子来说明什么是单一职责原则。

只要做过项目,肯定要接触到用户、机构、角色管理这些模块,基本上使用的都是RBAC模型(Role-Based Access Control,基于角色的访问控制,通过分配和取消角色来完成用户权限的授予和取消,使动作主体(用户)与资源的行为(权限)分离),确实是一个很好的解决办法。我们这里要讲的是用户管理、修改用户的信息、增加机构(一个人属于多个机构)、增加角色等,用户有这么多的信息和行为要维护,我们就把这些写到一个接口中,都是用户管理类嘛,我们先来看它的类图,如图1-1所示。

王大虎

图1-1 用户信息维护类图

太Easy的类图了,我相信,即使是一个初级的程序员也可以看出这个接口设计得有问题,用户的属性和用户的行为没有分开,这是一个严重的错误!这个接口确实设计得一团糟,应该把用户的信息抽取成一个BO(Bussiness Object,业务对象),把行为抽取成一个Biz(Business Logic,业务逻辑),按照这个思路对类图进行修正,如图1-2所示。

重新拆封成两个接口,IUserBO负责用户的属性,简单地说,IUserBO的职责就是收集和反馈用户的属性信息;IUserBiz负责用户的行为,完成用户信息的维护和变更。各位可能要说了,这个与我实际工作中用到的User类还是有差别的呀!别着急,我们先来看一看分拆成两个接口怎么使用。OK,我们现在是面向接口编程,所以产生了这个UserInfo对象之后,当然可以把它当IUserBO接口使用。也可以当IUserBiz接口使用,这要看你在什么地方使用了。要获得用户信息,就当是IUserBO的实现类;要是希望维护用户的信息,就把它当作IUserBiz的实现类就成了,如代码清单1-1所示。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注