设计模式学习完了,当然是要总结一下的。
学习设计模式当然首先要了解什么是模式啦,模式呢,就是在特定的环境下人们解决某类重复的出现的问题的一套成功或者有效的解决方案。
我们从事软件设计的人员应该了解到在软件开发生命周期的每一个阶段都存在一些被认同的模式。
软件的模式分为四部分:分别是问题描述、前提条件、解决方法和效果。
由模式的定义可以得到,软件的设计模式可以理解为在特定的条件下为一些重复出现的软件设计问题提供合理的、有效的解决方案。
使用设计模式的好处有很多:
1、它有助于提高软件开发和设计的效率。
2、提供一套通用的设计词汇和一种通用的形式,方便设计人员之间的沟通与交流。
3、很大程度上都兼顾了系统的可重用性和可扩展性。
4、有助于初学者更加深入的理解面向对象思维。
5、使代码更容易被他人理解并保证代码的可靠性。
面向对象设计方法所需要考虑的核心问题就是如何同时提高一个软件系统的可维护性和可复用性。面向对象的设计原则就是为支持可维护性复用而诞生。
首先总结一下设计模式的七个原则:
单一职责原则(Single Responsibility Principle, SRP):
概念:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
为什么要遵守这个原则呢?因为如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。
这是一个神奇的原则,因为它是最简单但又最难运用的原则,单一职责原则是实现高内聚、低耦合的指导方针,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。
开闭原则(Open-Closed Principle, OCP):
概念:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
为什么要遵守这个原则呢?因为开闭原则是面向对象设计的核心所在,多扩展、少修改,既可以保持软件的相对稳定性和可靠性,还可以根据需求的改变不断的推出新版本。也就是可维护、可扩展、可复用、灵活性好。
里氏代换原则(Liskov Substitution Principle, LSP):
所有引用基类(父类)的地方必须能透明地使用其子类的对象,也就是子类型能够替换掉它的父类型,程序的行为没有变化。
为什么要遵守这个原则呢?为了提高软件的可复用性,当子类替换掉父类,软件单位的功能不受影响时,父类才真正的被复用,而子类也能够在父类的基础上增加新的行为。
依赖倒转原则(Dependency Inversion Principle, DIP):
概念:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
为什么要遵守这个原则呢?依赖倒转原则可以提高程序的可扩展性,也可有效的降低程序耦合;依赖倒转原则避免了修改负责复杂逻辑的高层模块,大大提高了程序的稳定性。
接口隔离原则(Interface Segregation Principle, ISP):
概念;使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口,类间的依赖关系应该建立在最小的接口上。
为什么要遵守这个原则呢?因为对接口进行细化可以提高程序设计灵活性,但是注意要有限度。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
合成复用原则(Composite Reuse Principle, CRP):
概念:尽量使用对象组合,而不是继承来达到复用的目的。简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承。
为什么要遵守这个原则呢?组合/聚合可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少;而通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性。
迪米特法则(Law of Demeter, LoD):
概念:一个软件实体应当尽可能少地与其他实体发生相互作用。
为什么要遵守这个原则呢?迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。