再读《设计模式解析》

前言:应部门架构师的建议,今年5月再次阅读了该书,确实又有了新的收获,从全局有了更清晰的认识,也让自己体会到该如何去分析、解决问题。建议读本书时,能够去观察到作者编写该书时的思路,有利于我们更深层次的理解设计模式的本质。

第1部分:面向对象软件开发简介
该部分以更独特的观点阐述了作者关于面向对象的理解。针对类、封装、继承、多态等面向对象术语进行了更本质的描述。读完后有种醍醐灌顶的感觉。
类:根据对象所具有的责任定义对象的类型。责任可以分为行为、状态,这些分别是由方法/数据实现的。
封装:任何形式的隐藏。
功能分解是常用的程序设计方式,将一个问题逐渐分解为更小功能的方法,直到每个功能点可以管理。解决更小的问题比解决整个问题要更简单,但需求变更始终伴随着整个软件的开发周期。如果不能进行很好的功能分解、未来需求的预测、变化点封装,将极易产生低内聚、高耦合的代码,这样的代码是很难维护的。

第2部分:传统面向对象设计的局限
作者在按照几个步骤介绍了CAD/CAM系统:提取需求信息、了解专业术语的必要性、问题描述、挑战及解决方案。
通过标准的面向对象解决方案,作者进行了第一版设计,描述了传统面向对象设计开发中存在的问题:没必要的继承层次结构,这种结构往往是紧耦合而且低内聚的,以及类爆炸(未来发生变化时会出现),过分依赖继承带来超出正常的维护成本。

第3部分:设计模式
设计模式是在某一背景下某个问题的一种解决方案。它们绝不只是解决某个个别问题的模板,它们是描述冬季的一种方式,不仅包括我们要得到的效果,也包括困扰我们的问题。
学习设计模式的理由:①对不断重复出现的问题,复用既有的、高质量的解决方案;②确立通用的术语,改善团队内的沟通;③提升思考层次;④判断设计是否正确,而不仅仅是能够奏效;④改善个人学习和团队学习;⑤提高代码的可修改性和可维护;⑥采用更佳设计方案,即使没有明确使用模式;⑦发现巨型继承层次结构的替代方案;
传统上看待对象、封装和继承的方式有很大局限性。封装的存在绝不仅仅是为了隐藏数据。将其定义扩展为“任何形式的隐藏”之后,可以用封装来创建对象之间的层——这样就可以对位于层一侧的内容进行修改而不造成影响。将继承看做对概念上相同的各个具体类的处理方法,比看成一种特化方法,要合理的多。
用共性和可变性分析在我们的问题领域寻找对象,比寻找名词和相应的动作更加有效。
敏捷方法、极限编程、测试驱动开发等能产生许多较好的代码品质,这些品质与设计模式所带来的品质是一样的,都是殊途同归——高内聚、松耦合、可读性、可测试性等。

第4部分:组合起来:用模式思考
设计中需要减少脑子里思考的事情,优先考虑对象与对象之间的关系,而不是如何去创建他们。先考虑系统中需要什么,然后再去关注如何创建他们。
传统设计方法往往由部分到整体,但这样很难真正产生符合整体问题背景的设计,通常只见树不不见林,因为注意力过分集中在系统的细节上。在设计决策时,常常限于细节之中,而忘记了系统更大的背景。细节会时我们注意力放在小而且局部的决策上,它会成为遮蔽更大的总体概念的浮云。
模式为我们提供了一种语言,使我们能够超越于细节之上,以实际的方式讨论背景。这样使我们更可能看到问题域中的约束因素。用模式思考,通过学习按背景设计(寻找为其他模式提供背景、约束的最高层模式,并不断循环该步骤寻找下一层次的模式,找到适合整体的设计),有助于吸取前人的经验教训,有助于创建健壮、可维护而且有生气的系统。

第5部分:迈向新的设计方式
该部分讲述了一种新的设计方式,不同于特殊化,也不同于寻找问题域中名词和动词的方式。主要讨论了从模式中获得的经验来设计应用程序架构,主要讲述的是功能上的变化的处理方式。
不要随意套用、滥用设计模式,要从背景设计,在类中封装变化。模式实现的具体方式应该由问题的本质、约束条件和需求等等决定,而不是根据你再某本模式书中碰巧看到的某个实现。
试图确定所有可能的变化通常并不能获得更好的系统,这样往往一事无成,这就是所谓的分析瘫痪。
阐述了如何使用CVA(共性和可变性分析)创建应用程序的高层设计。通过先定义共性,消除了特殊情况之间的耦合。因为设计模式的本质实际上就是隔离变化和共性,这与共性和可变性分析异曲同工。
使用分析矩阵进行问题域的分析

第6部分:迈向新的设计方式
该部分主要说明,在功能之外可能出现的不同变化类型,扩展模式封装变化的概念。

第7部分:各种工厂模式
工厂模式可以帮助对象的创建。但是这可能并非它们最重要的作用。换一个新角度,会发现更多的作用:将对象的使用与对象的构造和管理分离开来。
使用设计模式,会创建许多可扩展的类。如果管理这些对象,正是工厂的用武之地,称工厂为“对象管理者”更合适。

第8部分:终点与起点
该部分主要对书中的核心观点进行了总结,包含面向对象的原则及新视角,设计模式如何封装实现,共性和可变性分析与设计模式,按责任划分问题域(问题分解),模式和从背景设计,模式内部的关联,设计模式与敏捷编程殊途同归,如何更好的学习设计模式。


猜你喜欢

转载自blog.csdn.net/key_next/article/details/80600627