单一职责原则(SRP)
定义
就一个类而言,应该仅有一个引起它变化的原因
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意向不到的破坏
理解:
讲一个关于小猫钓鱼的故事吧。小猫和妈妈去钓鱼,刚坐下钓鱼没有多久看到周围有蜻蜓飞过,小猫放下鱼竿去捉蜻蜓了,蜻蜓飞的太快,小猫没有捉到,回去继续钓鱼,不一会儿,有蝴蝶从身边飞过,小猫看着漂亮有去捉蝴蝶了,蝴蝶也飞的很快,飞走了,小猫沮丧的回来了,看到妈妈钓到了大鱼,自己的篮子却是空空的,妈妈教导了小猫,钓鱼需要一心一意,才可以,这次小猫坐在原地等着钓鱼,一段时间后果然钓到了鱼儿。
通过这个故事可以看出小猫在钓鱼的时候捉蜻蜓捉蝴蝶会影响钓鱼,钓鱼和捉蜻蜓发生了耦合,当专心做一件事情的时候才会成功。 软件设计也是如此真正要做的许多内容,就是发现职责并把那些职责相互分离,当多于一个动机去改变一个类,那么这个类就具有多于一个的职责,就应该考虑类的职责分离。
里氏替换原则
定义:
子类必须能够替换掉它们的父类型
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且不察觉出父类对象和子类对象的区别。
作用:当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
理解:
在西游记里真假美猴王里的孙悟空,六耳猕猴和孙悟空简直就是一个模子里刻出来的,拿孙悟空作为父类来说,六耳猕猴作为子类, 六耳猕猴有筋斗云会七十二变,也有紧箍咒,等等,就很好的体现了里氏替换。
依赖倒转原则
定义
高层模块不应该依赖底层模块。两个都应该依赖抽象
抽象不应该依赖细节。细节应该依赖抽象
理解
面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。依赖倒转很好的解决了这个问题;
主要针对接口编程,不要对实现编程
依赖倒转可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之就是程序化的设计
开放—封闭原则
定义
软件实体(类、模块、函数等等)应该可以扩展,但是不可修改
特征:
对于扩展是开放的(有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。)
对于更改是封闭的(类一旦设计完成,就可以独立完成对应工作,而不要对类进行任何修改。)
理解
开放—封闭原则是面向对象设计的核心所在,
好处:可维护、可扩展、可复用、灵活性好,
有了里氏替换原则,才使得开放—封闭原则成为了可能,由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展
迪米特法则(LoD)
定义
如果两个类都不彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
理解
买衣服的故事,家长给小孩子买来件漂亮的衣服,服务员A开票,家长把衣服拿回来穿上有些小,这时候家长在拿回来换,可是刚在卖衣服的服务人员A不在了,那该怎么办呢?家长拿出小票,服务人员B一看就知道这是本家的衣服了。这样家长通过小票的证明就可以及时的更换衣服了。
迪米特法则的根本思想:强调了类之间的松耦合。类之间的耦合越弱,若有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
合成/聚合复用原则(CARP)
定义
尽量使用合成/聚合,尽量不要使用类继承
聚合:表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;
合成则是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。
好处:优先使用对象的合成/聚合将有助于保持每个类都被封装,并被集中子在单个任务上。这个样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物
关于设计模式的六大原则就说到,这里了,感谢大家的阅读,如有问题,欢迎交流