设计模式与抽象 一

一、基本概念 

设计模式:

         无数码农前人在实际的生产项目中经过不断的踩坑、爬坑、修坑的经历总结出来的经验教训,经过抽象之后表达成的概念。

理解:

         不好理解,实际上并不是你看不懂,而是你不明白为何要如此“故弄玄虚"。这个很好明白,等你真正经历大型项目开发、迭代、重构、甚至重写之后,你就会赞同这些能写出设计模式的人,是多么的高瞻远瞩,多么的有智慧。

本质:

       一言以蔽之,设计模式的本质就是:将软件中变化的部分和不变的部分分开。

掌握:

       要从整体结构上、从本质目标上、从思想体现上来把握,而不要从局部、从表现、从特例实现上来把握。

二、有没有必要掌握

软件生命周期:       

       软件产品从概念阶段到最后的面向用户的过程中,不是意味着产品的生命周期就结束了!以后还会有产品功能的扩展,还会维护产品,还需要重用产品的一些已有成果。

       也就是我们所说的易扩展性,可维护性,可复用性!为了实现这个就需要从软件设计时分层和分割的时候做到高内聚低耦合!

设计模式:

       23种设计模式就是从构建,行为,结构的角度来设计的一些类之间的关系抽象。从而从一定程度上实现高内聚低耦合,进而达到可扩展性,可维护性,可重用性。

三、有没有用过

三十六计 玄不玄?也玄!

       那两三千年来世界其他国家没看过<三十六计>是怎么打仗的?照样打。没学过三十六计的人就不会使用里面的计策吗?当然会用,而且经常用。只是不知道古代已经把它总结成“战争模式”了。比如“借刀杀人”,相信这个人们在耍小聪明的时候都用过;“打草惊蛇”这个计策估计连小孩都会用,还有很多。

没学过设计模式就没有使用过吗?非也!

       一样经常用到,只是你不知道前人已经写成书。设计模式虽然名字很玄,并且可能你没看过相关的书籍,但不代表你没有用过。

        比如你在写共享一个实例的时候你可能已经用到了单例模式,当你想要兼容时可能已经用到了适配器模式,当你组合某个控件时你已经用到了组合模式等等。

四、境界

第一阶段:手中无剑,心中无剑

      听别人说到“设计模式”感觉特别高大上,自己不太懂,也用不太起来。

第二阶段:手中有剑,心中无剑

       经典23式开始一招一招比划。但此时手中虽有了重剑,却不太能舞起来。

       缺乏实际经历的应用场景去做参考,看着书中的例子很难感同身受,很难引起共鸣,而且很有可能模式的描述和场景压根就不太明白。

第三阶段:手中有剑,心中有剑
       随着自己的学习和开发经历的丰富,已经对设计模式有一定理解了。在阅读开源代码,你经常可以发现可以对应于某模式,你逐渐明白了某个模式用在某个地方能起到什么作用,你经常会有一种"Wow"的赶脚。

       在编程过程中,能够照猫画虎的用设计模式了。而且你开始学习面向对象设计原则,比如SOLID原则也有了一定的理解。你跟别人讨论时,可以大声地说:让我们使用一个XX模式来支持更好的扩展性吧。你时不时会回头去看设计模式,除了能够提供参考,此时你会有一些新的体会了。

第四阶段:手中无剑,心中有剑(人剑合一)

       已经有设计和架构的概念了,这时你已经开始面对一个几万行甚至几十万行的项目,有一天你发现代码已经很难快速响应需求变化了,又没办法推倒重来,所以来重构吧,重构的过程中,一个个设计模式把代码维护中的一个个痛点逐个击破,你对代码的“smell”有了更深刻的理解,你开始对copy-paste代码深恶痛绝,你发现原来重构和设计模式竟然是孪生兄弟。

       开始明白一个长期维护和演化的项目,设计如此之重要。 “面向接口编程”,“组合优先继承”,多么朴素的文字,或许很多人都能说出来,但是你确定你现在的理解更加深刻了。

       你会发现,此时你手中已经无剑了,你不会想着什么模式列表了,不会想着某个模式重要了。

       进行一个复杂设计时,不自觉地就从软件开发的终极目标“高内聚低耦合”出发,“面向接口编程”,“组合优先继承”,“创建与使用分离”等认知成为本能反应,结合需求场景,每定义下一个类都有“开放封闭”等各种面向对象设计原则护体,随着项目演进,你能敏锐地嗅到各种代码smell,知道如何考虑现有资源去减少该死的技术债,随时进行着重构。

       有一天, 有人问你,怎么State模式和Strategy模式的类图是一样的? 你装逼地笑了笑,说到:这些不重要,心中有剑就能无往不胜。

五、抽象

什么是抽象?

       个人认为抽象应该是抓住事物本质,然后剥离出来在更为宽泛的条件下进行模拟演绎的过程。

       真正的高手就是要把简单的事情先复杂化(全面、周全、系统),然后——抽丝剥茧,再把复杂回归到简单。

       从简单到复杂,体现的是系统化,全面性。
       从复杂到简单,则更多要进行抽象化思考。

       抽象就是从表面看到本质,从片面看到整体,然后抽出那些稳定的、共同的特征。

抽象能力重要吗?

         写代码需要抽象能力,无比需要。如果你不想一辈子都做一个码农,如果你想写出来一些自己也感觉到满意的代码,如果你想未来不被更高级的编码工具取代,你需要学会抽象。

        花半秒钟就看透事物本质的人,和花一辈子都看不清事物本质的人,注定是截然不同的命运。

六、抽象能力

抽象能力,决定着对事务的认知分析。

看山是山、看水是水

看山不是山、看水不是水

看山还是山、看水还是水

对于 10w 行以下的代码量的汉子来说,设计模式=玄学。
对于 10w ~ 50w 行代码量的汉子来说,设计模式=科学。
对于 50w 行以上代码量的汉子来说,设计模式=文学。

七、如何抽象

1. 寻找事物的宏观结构,所谓格局: 格局,无非是不同层次事物间的连接,过滤掉不需要的细节,抽取出一个宏观结构。

2. 结果导向的思维: 模型都是在讲输入和输出,你设计一个模型把一定的输入变成一定的输出。 这种思维和“跟着感觉走”是截然相反的过程。

3. 确立边界及简化理论: 所有物理定律都有明确边界,而对边界以外的东西尽量不触碰。

八、设计模式概图

 

 

 

欢迎关注公众号:“架构一线”,定期分享一些实战心得,互联网前沿技术等.

你可能感兴趣的:(设计模式)