设计模式之开篇
关于设计模式的学习,其实我自己已经整理了一份笔记了,只不过我很久之前系统的学习还有整理了一遍,需要直接获取我自己的全套笔记的也可以私聊访问我的github地址哈。
好了,言归正传。在正式介绍设计模式之前,我想要先说一下关于设计模式的一些东西。
什么是设计模式?为什么要写设计模式?为什么要用设计模式?什么时候要用设计模式?好像还有不少问题,总之我不希望自己对一些东西自己都没有思考过,跟风的去学习,去使用设计模式,导致滥用设计模式。
老祖说,学以致用。是的,我们学习就是为了使用的,那么什么人会用呢,对于开发者开说,我想先说一下,我是一名java开发者,所以往后的文章基本会以java的语法的方式来结合使用。我们都是软件开发者,是写软件的,既然是写软件就是为了写优秀的,好的软件系统。
通常认为,一一个易于维护的系统,就是复用率较高的系统:而一个复用性较好的系统, 就是一个易于维护的系统。但是实际上,可维护性和可复用性是两个独立的目标,就像两 只奔跑的兔子一样,并不总是方向一致的。
软件系统设计的两个重要特性
对于面向对象的软件系统设计来说,在支持可维护性(Mainainabiliy) 的同时,提高系统的可复用性(Reusebility) 是一个核心的问题。
导致可维护性低的四个原因
Rober C. Martin 在[MARTINOIMARTIN96]中指出,导致一个软件设计的可维护性较 低,也就是说会随着性能要求的变化而“腐烂”的真正原因有四个:
1. 过于僵硬(Rigdity)
难以加入新的性能和模块。
2. 过于脆弱(Fragility)
修改已经存在的代码,会导致其他模块或代码出现bug。
3.复用率低(mobilil)
包括代码、模块、数据结构等的在其他模块重复使用。
4.粘度过高Viscosiy.
修改时,可以以第一种方式:以原始设计意图和原始框架设计进行修改,也可以以破坏原始设计框架的方式进行修改,如果以破坏的方式进行修改比较容易的话,那么就是粘度过高。为什么粘度过高,不好。因为一第一种方式对系统的未来比较有利,第二种是权宜之计,可以解决短期问题,对中长期比较不利。
比较好的系统设计与目标
1.可拓展性
新的功能很容易的加入,不会涉及其他模块。
2.灵活性
可以平稳的修改原有代码,不会影响其他模块。
3.
可插入性
可以很容易的将一个类i抽离出去,同时可以将同样接口的类插入进来。也就是粘度过高的反面。
可复用性
软件的复用的好处
第一,较高的生产效率:
第二,较高的软件质量:
第三,恰当 使用复用团以善系统的可维护性
传统的复用
1.代码的剪贴复用 利用现代的代码编辑器、集成开发环境(IDE)着,可以很容易地做到碱少抄写代码 的人力成本。这虽然比完全没有复用好些但是靠剪贴源代码达到复用,仅仅是复用的 最初步的做法。
2.算法的复用
各种算法比如排序算法得到了大量的研究。现在几乎不会有人在应用程序编程时试图 建立自己的排序算法,通常的做法是在得到了很好的研究的各种算法中选择一个。这就是 算法的复用。
3.数据结构的复用与算法的复用相对的, 是数据结构的复用。如队、站、队列、列表等数据结构。
传统的复用方案的一个致命缺陷就是复用常常是以破坏可维护性为代价的[KIRK02]. 比如两个模块A和B同时使用另一个模块C中的功能。那么当A需要C增加一个新的行为的时候,B有可能不需要、甚至不允许C增加这个新行为。如果坚持使用复用,就不得不以系统的可维护性为代价;而如果从保持系统的可维护性出发,就只能放弃复用。
4.面向对象的复用
像Java这样的面向对象的言中,数据的 抽象化、 继承、封装和多态性是几项最重要的语言特性, 这些特性使得一个系统可以在更高层次实现复用。多态性使得实现和应用可以 复用[PALS90]; 抽象化和继承关系使得概念和定义可以复用: 而括象化和封装可以保持和促进系统的可维护性。复用的焦点不再集中在细节,这样一来 就集中在重要的含有宏观商业逻辑的抽象层次上。换言之, 复用的焦点发生了“倒转”。 发生复用焦点的倒转并不是因为实现细节的复用不再重要,而是因为这些细节上的复 用往往已经做得很好,而且抽象层次是比这些细节更值得强调的复用焦点,因为它们是在 提高复用性的同时保持和提高可维护性的关键。
总结起来,这篇文章只有一句话:
在面向对象设计里,可维护性的复用是以设计原则和设计模式为基础的,使用适当的设计模式可以使软件系统具备更好的可维护的复用性,提高灵活性可维护性和可插入性。