我们在学习、开发或面试时经常会听到设计模式,很多同学也多多少少能说出一点关于设计模式的东西来,但是很多同学却一直无法理解设计模式的精髓,那么今天开始我们就来聊聊设计模式~   我们依旧提出几个问题:   01设计模式和设计原则是什么关系?   答:所有的设计模式都是遵循设计原则的,不能违反设计原则。   02设计原则的核心思想是什么?   核心思想只有两条:减少复杂度(让一个复杂的逻辑变成多个简单的逻辑),降低耦合度(让模块之间的关联减少,使得模块之间更独立、更清晰)   那么今天我们就来用邓哥的故事来和大家聊聊设计模式的六大基本原则。   1.单一职责原则   周末恰逢邓哥休息在家,感受安静的清晨,正准备睡个回笼觉之际,邓嫂将邓哥踢下床对邓哥说:“把屋子扫了,衣服洗了,午饭做了,衣橱整理一下~”   邓哥只能耷拉着双眼乖乖的去干活。但是邓哥要做的事情太多,所以手忙脚乱的。结果洗衣服没有甩干,洒了一地的水,手沾了水弄湿了衣橱里的衣服,做午饭忘了时间弄糊了。然后只能乖乖的去跪搓衣板。。。   在这个故事里,邓哥就好比是程序中的一个模块。我们尽量不要在一个模块里写过多的业务逻辑,否则业务逻辑之间可能会相互干扰,引起更多的错误。   在这个故事中,如果只让邓哥做一件事,估计还是可以做的好的,但是同时让邓哥做这么多的事,就会出现问题。所以单一职责原则的本质就是要将一个复杂的逻辑拆分成多个简单的逻辑,以此来降低复杂度。   2.里氏代换原则   邓哥喜欢妹子,可以推出邓哥喜欢邓嫂(因为邓嫂是妹子)。但是邓哥喜欢邓嫂,无法推出邓哥喜欢所有的妹子(主要原因可能是不敢)。   里氏代换原则的一个核心思想就是父类能做的事、能去的地方,子类必须也能做、也能去。   从逻辑上举个例子,大前提:我喜欢动物。小前提:大熊猫是动物。结论:我喜欢大熊猫。   在这个例子中,大熊猫是动物的一种,所以很明显动物是大熊猫的父类,所以对父类成立的逻辑对子类也必然成立。但是反过来,我喜欢大熊猫无法推论出我喜欢动物。所以如果一个方法或模块使用了一个子类,那么这个子类不能用其父类代替。   里氏代换原则的核心:父亲能做的孩子都能做,孩子能做的父亲不能做,降低耦合度。   3.开闭原则   闭原则:邓哥在外边经常受欺负,邓嫂很生气,觉得这样很不合理。于是规定:邓哥只能被邓嫂打,如果有人想要打邓哥,必须和邓嫂说,然后由邓嫂来打邓哥~   开原则:邓嫂经常觉得邓哥太笨了,琴棋书画不会,洗衣做饭嫌累。所以邓嫂决定让孩子来学习琴棋书画。   开闭原则的核心就是对修改关闭,对扩展开放。   就像是在这个例子中,如果谁都能打邓哥就乱套了,所以规定只能由邓嫂来打邓哥,这样方便管理。这就是对修改关闭。   当我们觉得邓哥的功能太少的时候(琴棋书画不会),我们也不能直接给邓哥增加功能,只能通过扩展的方式(让邓哥的孩子来学)。这样最后总体上邓家就有了会亲戚书画的人了。   由于里氏代换原则的存在,在需要邓哥的时候,邓哥的孩子可以替代,所以就解决了邓哥不会琴棋书画的问题~开闭原则的核心:对修改关闭,对扩展开发,依次来减少耦合度。   4.依赖倒置原则   邓哥每天在家都听邓嫂指挥,终于有一天邓哥硬气了一回~邓哥对邓嫂说:“你每天都命令我做这个做那个,传出去我多没面子~我不要面子的嘛~?”邓嫂想了想觉得邓哥说的确实有道理。于是对邓哥说:“以后每天我就不命令你了~你每天看小纸条吧~小纸条上写什么你就做什么,都是小纸条命令你的,和我就木有关系了~”   邓哥一想有道理,于是就答应了。从此以后,每天邓嫂都不会对邓哥呼来唤去了~有什么事就往小纸条上写~   邓哥和邓嫂就相当于程序中的两个函数或者两个模块。原本这两个模块是相互依赖的关系(A调用B)。但是这样会有一个问题,就是当一个模块发生修改的时候,总会对相关模块产生影响,为了降低这种影响,人们决定使用依赖倒置原则来降低核心模块间的耦合度。   依赖倒置原则的核心:让原来相互依赖的两个核心模块,变为同时依赖于另一个非核心模块。以此来降低核心模块的耦合度。   5.接口分离原则   有一天邓哥对邓嫂说:“我想下楼买菜,回家打游戏,晚上吃排骨&……#%&&#*巴拉巴拉一大堆”,邓嫂对邓哥说,一口气说这么多谁听得懂~一件一件说~   很多的同学在工作初期,喜欢定义一个接口之后,通过传不同的参数做不同的事,最后只有一个接口,但是参数极其复杂。   就像是这个例子中这样,邓哥虽然只说了一句话,但是内容极其复杂,这样明显增加了系统的复杂度。   所以我们需要使用接口分离原则,其实接口分离原则和单一职责原则非常的像,就是每个接口负责的内容尽量单一,不要使用复杂的总接口,以此来降低系统的复杂度。   6.迪米特法则   邓嫂为了不让邓哥学坏,平时经常告诫邓哥:“不要和陌生人说话~”   “不要和陌生人说话”就是迪米特法则的精髓所在,迪米特法则指的就是:除了自身,当前对象的成员,参数,当前对象所创建的对象之外,尽量不要与其他外部实体或模块产生关联(引用或调用),以此来降低系统的耦合度。   最后,六大基本原则才是程序设计的基本原则,我们学习的设计模式只不过是遵循基本原则的比较经典的具体实践。比如工厂模式,符合开闭原则、策略模式符合依赖倒置原则,观察者模式符合依赖倒置原则等等。所以我们在学习的时候,一定要学习知识的本质,不要只学习表象,否则就会出现学了还不会用的情况~