设计模式的六大原则:理解设计模式的关键思想和应用

Posted 泡沫o0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式的六大原则:理解设计模式的关键思想和应用相关的知识,希望对你有一定的参考价值。

设计模式的六大原则

前言

设计模式的六大原则是面向对象编程中非常重要的基础理论。这些原则不仅能够帮助我们设计出高质量、易于维护、易于扩展的代码,还能够提高开发效率和代码复用率。这六大原则分别是单一职责原则、里氏替换原则、依赖倒转原则、接口隔离原则、迪米特法则和合成复用原则。其中,开闭原则是这六大原则的总原则,指的是对扩展开放,对修改关闭。只有遵循这些原则,才能够设计出高效、可靠的面向对象程序。


设计模式的六大原则

原则解释
单一原则 (SRP)一个类只做一件事
开放-封闭原则(OCP)软件实体(类、模块、函数)可以拓展,但是不可修改
依赖倒转原则(DIP)A.高层模块不应该依赖底层,两个都应该依赖抽。B.抽象不应该依赖细节,细节依赖抽象
里氏代换原则(LSP)子类型必须能够替换掉它们的父类型
迪米特法则(LoD)如果两个类不必直接通信,那么这两个类不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可通过第三者发起这个调用
合成/聚合复用原则(CARP)尽量使用合成/聚合,尽量不要使用类继承
  • 总原则:开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。

1、单一职责原则

不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。

2、里氏替换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。

而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

**注意:**里氏替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。

3、依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。

使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

5、迪米特法则(最少知道原则)(Demeter Principle)

就是说:一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。

这样当被依赖的类变化时,才能最小的影响该类。

最少知道原则的另一个表达方式是:只与直接的朋友通信。类之间只要有耦合关系,就叫朋友关系。耦合分为依赖、关联、聚合、组合等。

我们称出现为成员变量、方法参数、方法返回值中的类为直接朋友局部变量、临时变量则不是直接的朋友。我们要求陌生的类不要作为局部变量出现在类中

6、合成复用原则(Composite Reuse Principle)

原则是尽量首先使用合成/聚合的方式,而不是使用继承


总结

总体来说,设计模式的六大原则是面向对象编程中非常重要的基础理论,包括单一职责原则、里氏替换原则、依赖倒转原则、接口隔离原则、迪米特法则和合成复用原则。这些原则可以帮助我们设计出高质量、易于维护、易于扩展的代码,并提高开发效率和代码复用率。总原则是开闭原则,即对扩展开放,对修改关闭。只有遵循这些原则,才能够设计出高效、可靠的面向对象程序。在实际开发过程中,我们应该结合具体的业务场景和需求,灵活运用这些原则,以达到最优的设计效果。

设计模式六大原则

 一、开闭原则

是什么:对扩展开放,对修改封闭。可以理解为,可以根据需求随意增加新的类,但不要对原有的类进行修改。

用处:1.可扩展度高,灵活。可以通过新增模块满足不断变化的需求。2.可维护性强,无需修改代码。可以保证变化的系统有一定的稳定性和延续性

实现:开闭原则的核心思想在于抽象,对于不变的部分,把它抽象成不变的接口,变化的部分需要进行评估和分类,每一个可变的 因素都要进行单独的封装。例如原本有个商品类,现在推出活动,需要对商品进行打折处理,可以通过新建一个打折商品类继承商品类的形式来实现。

 

二、单一职责原则

是什么:就一个类而言,应该仅有一个引起他变化的原因。防止相同类型的职责,分离到不同的类中,并且同一个类无需编制多余的职责,符合高内聚低耦合的标准。

用处:1.有助于清晰的理清设计与编码的思路。2.有助于简化维护,编码,测试的流程。3.复杂问题简单化,有利于代码的重用。4.职责之间消除耦合后有利于系统的扩展。

实现:1.从面向对象的角度分析,按照对象的属性,运动规律的相似性来确定职责。2.从业务功能的角度进行分析,例如将增删改封装成一个类。并且要注意类的大小范围要适中。范围过大职责过多,就会造成这个类很难维护

 

三、里氏代换原则

是什么:子类必须可以替换掉他们的基类(面向对象语言中的继承所遵循的)

用处:提高代码的开放性

实现:通过继承实现

 

四、依赖倒换原则

是什么:1.高层模块不应该依赖于底层模块,二者都应该以来于抽象。在设计系统时,需要运用抽象来分析,而不是一开始就关注类的细节。2.要针对接口编程,不要针对实现编程。通过接口与抽象类进行各种变量,参数,方法的声明,并且禁止实现类去做以上声明。

用处:提高系统的灵活性和扩展性

实现:1.从实现抽象类的角度分析,需要保证引用‘基类’的地方,可以修改成其子类。2.从层次关系角度进行分析,需要定义清晰的层次关系,使每个层次通过接口的方式进行。3.从对象构造的角度进行分析,如果创建的是动态的对象,则使用依赖倒换,如果是静态的具体类并且变化率很低,则我们无需再穿件基类去继承,以规避维护多余代码的风险。

 

五、接口隔离原则

是什么:分离客户程序和接口1,不应该强迫客户依赖于他们不用的方法。2.一个类对另一个类的依赖性应当建立在最小的接口上。

用处:实现接口隔离原则减少代码的冗余和接口修改的频率(有点类似于单一职责原则)

实现:1.从逻辑角度考虑接口,我们也可以把某一类功能也设计成接口。2.根据场合和调用者的情况,消除无关的方法。3.对客户程序进行有效的区分,并对对应的接口进行变化。

 

六、迪米特法则

是什么:又叫做最少知识原则,就是一个对象应当对其他对象有尽可能少的了解,不必与不相识的人直接联系(类似代理模式)1.狭义上讲,如果两个类不必彼此直接通信,那么这两个类不应当直接的相互作用,如果其中一个类需要调用另一个类的方法,可以通过第三者转发这个调用。2.广义上讲,一个模块设计的好坏,一个重要的标识就是该模块在多大程度上讲自己的内部数据与现实的有关细节隐藏起来。

用处:1.有利于降低类之间的耦合,由于类之间去除了依赖关系,则各软件功能模块之间相互独立。2.如果系统需要扩展,则更加符合开闭原则对修改关闭的要求。3.将内部数据与实现细节隐藏,使各个功能子模块远离耦合,从而提高代码的重用性和可维护性。

实现:1.对类进行分类设计时,需要创建低耦合的层次关系从而达到高度重用的效果。2.每个类之间要降低成员之间的访问程度,尽量降低它的访问权限。3,.尽量把类设计成不变的类,以方便功能的实现。4.与依赖倒换相结合。过度的使用迪米特会产生大量的中间类,将会使系统维护变得复杂。

以上是关于设计模式的六大原则:理解设计模式的关键思想和应用的主要内容,如果未能解决你的问题,请参考以下文章

「设计模式」六大原则之五:依赖倒置原则小结

「设计模式」六大原则之五:依赖倒置原则小结

「设计模式」六大原则之五:依赖倒置原则小结

设计模式六大原则(四)----接口隔离原则

设计模式--六大原则

《邓哥奇遇记9》—— 设计模式之六大基本原则