设计模式的七大原则总结

一、单一职责原则

  • 目的

降低代码复杂度,提高类的可读性、可维护性,降低变更引起的风险。

  • 含义

对类来说的,即一个类应该只负责一项职责。一个类(或者大到模块,小到方法)承担的职责越多,它被复用的可能性越小,而且如果一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作。

  • 解说

单一职责原则是实现高内聚、低耦合的指导方针。通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。

  • 实例
    在这里插入图片描述

二、开闭原则

  • 目的

提高可扩展性,便于维护

  • 含义

一个软件实体应当对扩展开发,对修改关闭。也就是说在设计一个模块时,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为。

  • 解说

开闭原则还可以通过一个更加具体的“对可变性封装原则”来描述,对可变性封装原则(EVP)要求找到系统的可变因素并将其封装起来。
如果一个软件设计符合开闭原则,那么可以非常方便地对系统进行扩展,而且在扩展时无须修改现有代码,使得软件系统在拥有适应性和灵活性的同时具备较好的稳定性和延续性。为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键

  • 实例

在这里插入图片描述

三、接口隔离原则

  • 目的:

避免接口过于臃肿

  • 含义:

客户端不应该依赖它不需要的接口,即一个类对于另一个类的依赖应该建立在最小的接口上

  • 解说:

使用多个专门的接口来取代一个统一的接口。接口仅仅提供客户端 需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口, 而不要提供大的总接口。在面向对象编程语言中,实现一个接口就需要实现该接口中定义的所有方法,因此大的总接口使用起来不一定很方便,为了使接口的职责单一,需要将大接口中的方法根据其职责不同分别放在不同的小接口中,以确保每个接口使用起来都较为方便, 并都承担某一单一角色。接口应该尽量细化,同时接口中的方法应该尽量少,每个接口中只包含一个客户端(如子模块或业务逻辑类)所需的方法即可,这种机制也称为“定制服务”,即为不同的客户端提供宽窄不同的接口。

  • 注意:

我们需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来很不方便。一般而言,接口中仅包含为某一类用户定制的方法即可,不应该强迫客户依赖于那些它们不用的方法。

  • 实例:

在这里插入图片描述
在这里插入图片描述

四、依赖倒转原则

  • 目的

避免需求变化导致过多的维护工作

  • 含义:

高层模块不应该依赖低层模块,二者都应该依赖其抽象; 抽象不应该依赖细节,细节应该依赖抽象; 依赖倒转(倒置)的中心思想是面向接口编程。在java中,抽象指的是接口或抽象类,细节就是具体的实现类依赖倒转原则必须以里氏代换原则为基础。

  • 解说:

1、针对接口编程
2、在接口或抽象类中定义方法、声明变量
3、类只实现接口或抽象类中的方法,不要定义多余的方法
4、给抽象对象或接口注入依赖对象时,采用依赖注入方式(三种方式:构造注入、setter注入和接口注入)

  • 实例:

老司机Driver有driver方法,依赖了BMW的run方法,下次老司机想开奥迪,增加Audi类,但是需要修改司机类。此时需要面向接口编程,增加Car基类,Bmw和Audi类各自实现。老司机的driver方法接受一个Car实例,并调用即可。

或者

在这里插入图片描述

五、里氏替换原则

  • 目的

避免系统的继承体系被破坏

  • 含义

所有引用基类(父类)的地方必须能透明的使用其子类对象。

  • 解说

在编程中,如何正确的使用继承?答案-里氏替换原则。在使用继承时,遵循里氏替换原则,在子类中可以实现父类的抽象方法,尽量不要重写父类的非抽象方法。里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下(比如父类的某些方法在子类中已经发生畸变,则建议断开父子关系),可以通过聚合,组合,依赖来解决问题。

  • 注意

(1)子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。根据里氏代换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存在子类中,在父类中不提供相应的声明,则无法在以父类定义的对象中使用该方法。
(2) 我们在运用里氏代换原则时,尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。里氏代换原则是开闭原则的具体实现手段之一。
(3) Java语言中,在编译阶段,Java编译器会检查一个程序是否符合里氏代换原则,这是一个与实现无关的、纯语法意义上的检查,但Java编译器的检查是有局限的。

  • 实例

在这里插入图片描述
在这里插入图片描述

六、迪米特法则

  • 目的:

降低类与类之间的耦合。

  • 含义:

不要和“ 陌生人”说话,至于你的直接朋友通信,每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

  • 解说:

每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

  • 实例:

在这里插入图片描述
在这里插入图片描述

七、合成复用原则

  • 目的:

防止类的体系庞大

  • 含义:

尽量使用合成/聚合,而不是使用继承。

  • 解说:

当类与类之间的关系是"Is-A"时,用继承;当类与类之间的关系是"Has-A"时,用组合。
继承复用问题:会破坏系统的封装性,会把基类实现暴露给子类。
组合/聚合复用:已有对象的功能细节,对组合而成的新对象是不可见的,封装性教好。

  • 实例:

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值