设计模式 -前言

设计模式有用吗? 这个问题确实很难有一个客观的回答,就像很多人学习哲学一样,哲学有用吗? 估计每个人都会有自己的一番见解, 无论他是否了解或者学过哲学.哲学是什么,哲学大致上可以认为是一些经验的抽象或集成,其目的是探索事物的本质,即追求所谓的道.然后从另一种角度来说, 学过哲学的人, 并不见得一定比没学过哲学的人高明多少,或许还可能会成为一种负担, 当你为了你所踏出的每一步而思考的时候,思考就成了一种负担, 这个时候,正如老子说的, "人 法 地 , 地 法 天 , 天 法 道 , 道 法 自 然",于是一切有归于本源, 存在的即合理的. 也正是这句话, 哲学的存在也正有其合理性,毕竟让每个人都靠自己的经历重新学习一遍前人已经获得过的经验是件很不划算的事情, 而且很不现实. 于是,继承前人的思想, 并在其上有所建树, 才是文明得以传承的关键的一步. 当然,还有一句话叫"纸上得来终觉浅", 要想真正领会前人思想的精髓,除了要学习前人的思想外,还要尽可能的去实践这种思想, 将其变成一种经历,于是才可以真正使之成为自己的东西.所谓"学以致用". 言归正传,所谓"设计模式", 简单来说,是对一系列代码设计经验的总结,是处理一些特定问题时被实践过的常规套路. 当然,解决同一个问题的办法有很多,而且,也并不是很容易就看出哪些方法一定会优于另一些方法,设计模式也并非是定义了一些应用特定解决办法的环境, 更重要的,它是提供了一些思想, 让你灵活运用这些思想去构建自己的代码结构,使之符合一定的准则,同时,还会满足未来需求的变化,或更好的适应那些变化.因此,从这个角度来说, 设计模式也并非是一成不变的,实现只是它的表面,完全可以根据不同的要求而有不同的反映,不变的只是它的思想,是对它几个原则的贯彻而已.

下面,先来介绍设计模式所遵循的几个原则, 这才是设计模式的精髓所在, 而所谓的设计模式,不过是这几个原则在处理不同问题时的表现而已. 只是有时候,这几个原则的表现并非那么立竿见影而已.

单一职责原则:
越是重要的原则,可能理解起来就越简单,这个原则简单来说,就是对于一个类或其他的软件实体如模块,函数而言,功能要单一.套用官话来说就是对于一个类而言,应该仅有一个引起它变化的原因.似乎也并不太难理解, 一个类,应该有且只有一个功能,只有这个功能的变化才能引起它的变化.否则,类的功能过多,每个功能需要调整时,都需要去对类做改变,是很不合理的.就像手机有很多功能,比如照相,Mp3,这个当然并不能说不好,纯粹是看个人喜好,当然,这个前提也在于一个手机并不会使用太久,否则,镜头坏了,音响坏了,都要把手机整个送去修,并不是我们喜欢得到的结果.手机应该就是手机,只有当它打电话的功能受到影响的时候才应该去做处理.

开放-封闭原则
这种缩略语不解释一下是很难让外人明白的,所谓开放封闭原则,是说对于类,模块或函数而言,应该是可以扩展,但不可以修改的,即对扩展开放,对修改封闭.这种好处是不言自明的,可以扩展,当然是可以添加更多的功能以适应日后的需要,不可修改,是为了保证类的稳定,当其实现了一个功能之后,就作为一个独立运行的模块,只可以扩展其功能,而不能对其内部进行修改,降低了出错的概率. 这个原则, 是面向对象设计的核心所在,遵循这个原则,才可以创建出所谓可维护,可扩展,可复用,灵活性好的软件.

依赖倒转原则
这个原则可以简单解释成如下两部分,一是高层模块不应该依赖低层模块,两个都应该依赖于抽象,二是抽象不应该依赖于细节,细节应该依赖于抽象. 先来解释前半部分,拿电脑主机来说,里面包含主板,内存,硬盘,CPU等功能模块,如果一个部件坏了,则其他部件都不能用了,这种情况显然是很不合理的.而事实上也是,内存坏了,我们只需要更换内存,而不需要更换主板,尽管内存是插在主板上的,为什么呢,因为无论是内存还是主板,他们都依赖于一个抽象的对象,那就是接口,而对其他的部件没有依赖关系,我生产主板的时候,并不需要考虑内存是如何生产的,而只需要实现几个抽象的接口就可以了.其他的部件也是一样的,并不依赖于其他具体某个模块,而只依赖于抽象.这样,一个模块坏了,并不会影响到其他.解释完前半部分,后面应该也比较容易接受了.抽象不应该依赖于细节,所谓的内存即是细节,它应该依赖于抽象的接口,只有在接口改变的情况下,它才能够对应的起变化,而非自行变动.

里氏替换原则
子类型必须能够完全替换掉它们的父类型. 这是学继承时应该理解的概念,子类继承父类,则子类应该能以父类的身份出现,程序的行为应该没有变化.从实现的角度来说,子类应该实现父类所有的方法,当然也可以扩展其父类的方法.

迪米特法则
这个法则比较长,字面意思来说就是如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用.这个原则,体现了功能模块之间的低耦合.类与类之间的耦合度越低,则可以复用的价值越高.因此,当一个类没有必要与其他类发生关系时,就有必要不使其发生关系.

以上,即设计模式中几个重要的原则, 当然这些原则最终的体现都在于功能模块间的低耦合,高内聚,及可扩展性和可复用性. 而所谓的设计模式,即这些原则在处理不同问题时的不同体现而已.

posted on 2009-02-22 14:36  blue-boy  阅读(347)  评论(0编辑  收藏  举报

导航