设计模式往往被赋予神秘和神圣的光环,也经常作为面试的问题,区别你是初级开发人员还是中高级开发人员的一个方法就是问设计模式。设计模式也并不好学习,个人认为GoF的经典著作非常的难懂,这或许是因为他们站在非常高的位置上,他们的经验极为丰富,以致于如果你没有相关的经验,基本上跟他们不在一个频率上。市面上也有很多试图把设计模式叫的通俗易懂的书籍,不乏成功之作。而无论如何,如果你没有实际的经验,看再多的书也是枉然,你觉得你理解了,但是你确定你知道怎么用吗,如果不知道怎么用,那你就没有真正理解。你或许通过一些通俗易懂的书明白了一些设计模式的应用场景,一些设计模式的结构,但是你真的明白为什么要这样设计吗?为什么这样设计就好?或许你只是一味的关注“模式”,可曾关注过“设计”。 “设计”是个动词,既然要设计,那么请问怎么设计?设计要达到什么目的,又要遵守什么原则?
1. 设计的目的,目标
我们都是为了解决问题而设计软件,但是又不是单纯的解决了问题就算了,要解决问题可以用上万种方式,而设计模式提供的是一种好的方式,为什么说它好?因为它的设计达到了这样一些目标:低耦合,高内聚,高可复用性,可扩展性。这就是为什么模式能够成为模式,GoF的著作也无时不在讨论这样目标。如果你带着这样的思路去思考这些模式,你就不会怕你不能记住他们的设计。当然前提是你能理解这些模式如何体现了这些目标,最好是跟实际的产品相结合去理解。
2. 设计的原则
说是要设计,怎么设计?给你一个题目,告诉你开始设计吧,总得有些技巧,思路才行。就像上小学写作文,老师总会交你一些技巧,告诉你怎样的作文才是好的。胸中没有设计的原则,谈何理解设计?面向对象的N大设计原则是有必要好好理解一下的,开-闭原则,里氏替换,依赖倒置,接口分离,组合优先,最少知识。 呆着对这些原则的理解再去看设计模式,你就不会去死记模式的应用场景和模式的结构了。
3. 客户端代码
永远记得有个神秘的而又简单的东西叫客户端代码,这样的设计对客户端代码来说意味着什么?因为任何模式都是写来被别人用的,为什么这样写就好?因为别人用着好!
4. 接口和抽象类
总结下所有的模式,你会发现几乎永远离不开接口和抽象类。这一点非常显然,因为设计要面向抽象,然而并不被初级的开发人员发现。面对一个问题,初级的开发人员想到的永远是如何去实现,而不是如何去架构。也许你懂得java或者C++的语法,你却只知道面向过程的写法。很多人都熟知工厂模式,是否第一时间就想到工厂是个接口,而你可以由此实现不同的工厂。策略模式,策略其实也是个接口,你可以实现不同的策略,对于客户端代码而言,它只需要知道这个接口,而无需关注你的工厂或者策略的实现方式。如果你如此理解,就不难自己画出一个抽象工厂或者策略模式的类图了。
5. 其实并不神秘
当我为我的同事们分享设计模式这个主题之后,展示很多在项目中用到的设计模式,几乎很多人都说这些都是平常用到的东西,但是以前都没有觉得这还是个模式,有这么高级的名字。其实既然模式是人们常用的东西才叫模式,那你天天在用它就不足为奇了,如果你没有天天看到它,只有两个可能:1. 这就不是个模式,2. 你开发或者维护的那个产品真的锉到家了。 所以学习模式最好的办法就是结合你经常在用的那些代码。
当你慢慢理解了这些模式,你会发现你自己也经常会不经意间用到设计模式。