设计模式是根据原则为实现代码的复用、程序可扩展和稳定,对代码进行优化的过程和经验总结。当然,原则也是经验总结。原则是设计模式的执行纲领,重要性不言而喻。本篇博客就介绍六大原则。
## 一、单一职责原则
定义:不要存在多于一个使类变更的原因。简单说就是:各人自扫门前雪,修管他人瓦上霜,各司其职。
缘由:编写的软件不能没有错误,因此对代码的修改是必然的。为了避免某一处的修改导致更多的错误,就要求单一原则。单一原则要求每个类,每个模块各司其职,就减小了修改对其他类的影响。
优点:
1、降低类的复杂度,一个类只负责一项职责,使程序的逻辑简单。
2、提高类的可读性,提高系统的可维护性。
3、降低变更的风险。
故事说明:三国演义50回,曹操败走华容,关云长义释曹操的故事想必大家都知道。因为单次事件不足以模拟我们的代码,这里假设这个故事可以重复发生。诸葛亮对各个将领的职责分配是明确的,最后因为关羽念旧情放走了操作,使的诸葛亮的计谋最终没有达到想要的结果(即软件出现错误)。那么假设这件事重复发生了,我们知道了关羽(类)出了错,我们只要修改关羽就可以了,因为关羽之前的每一个步骤的结果都是对的。同时各个将领的职责时明确的,没有联系的,他们并不会因为关羽的改变而导致操作最后不走华容道。
## 二、开放封闭原则
定义:一个软件实体,类、模块或者函数应该对扩展开放,就修改关闭。简单的说就是可以增加功能,而不允许修改功能。
缘由:软件开发过程中必然要面临需求变更,那么对需求功能扩展时。我们要做的就是尽量的只增加功能,而不修改已经写好的部分。所以,要准备好扩展的接口,同时尽量不去修改写好的功能。
优点:保证框架,用实现扩展。
故事说明:假设你建立了一家小公司,然后经过多年经营,发展良好,有员工20名。原来没有配备财务人员的你需要专门的财务人员了,现在面临两个选择:一是,从公司的员工中挑一个送学习(修改),二是到人才市场上招聘一个财务人员(扩展)。你选哪个呢?显然第二种选择立竿见影的满足了你的需求。
## 三、里氏代换原则
定义:子类型必须能够替换它们的父类型,简单说就是“父债子还”。
缘由:这讲的是继承的原则,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才算真正被复用,而子类也能够在父类的基础上增加新的行为。
优点:代码继承复用
故事解析:倚天屠龙记赵敏袭击武当,张三丰教了张无忌太极拳,可以看做是继承关系。即张无忌从张三丰那继承了太极拳。这时玄冥二老要和张三丰打,但是他之前已经受伤了。于是,张无忌这个徒弟代替师父出战(里氏代换原则),但是这个继承关系并不影响张无忌还学会了很多其他武功。
## 四、依赖倒转原则
定义:高层模块不应该依赖低层模块,二者都应该依赖于其抽象;抽象不应该依赖细节,细节依赖抽象。简单的说就是依赖接口编程,不要对实现编程。即只要结果不顾过程。
缘由:假设高层类A依赖于低层B,这时要A类该为依赖于C类则必须对A类进行修改(这里B类和C类是相似功能的类)。这样将会带来不必要的风险。因此,如果加入一个抽象,即接口。将A类与低层的类隔开,他们共同依赖于接口。
优点:用一个稳定的接口将高层对低层的依赖关系破坏掉,则接口和高层,接口和低层之间的关系都稳定 了。为可能的修改降低风险。
故事解析:刘备要去攻打孙权,开始下了一道圣旨给张飞让他去打。后来觉得张飞靠不住于是又下了一道圣旨给关羽改他去打。这个过程当中刘备下了两道圣旨。后来,刘备招来了军师诸葛亮,这时他又想打孙权,于是下了一道圣旨给诸葛亮说我要打孙权。于是,诸葛亮就去调兵遣将去把孙权打了。有了军师之后,刘备只要关心和军师之间的关系就可以了,并不用在意谁去打。而张飞,关羽等也不用直接执行刘备的命令。这样就优化了他们的管理关系。这里诸葛亮的角色就相当于一个接口,有了他之后,刘备只需要做战略决策,个将领只需要负责打仗。
## 五、迪米特法则
定义:一个对象应该对其他对象保持最少的了解。简单说就是对象之间不依赖与关系来保证运行的。
缘由:类与类之间的关系越密切,耦合度越大。当一个类发生改变时,对另一个类的影响也越大。
优点:减少不必要的类间依赖,减低耦合关系。
故事解析:无