七大设计原则学习笔记

本文介绍了面向对象设计中的七个核心原则:开闭原则强调扩展开放,修改封闭;依赖倒置原则提倡高层模块依赖抽象;单一职责原则主张类只有一个职责;接口隔离原则鼓励小而专的接口;迪米特法则强调最少了解;里氏替换原则保证子类替换父类的正确性;合成复用原则倡导组合而非继承。这些原则有助于提升代码的灵活性和可维护性。
摘要由CSDN通过智能技术生成

一、开闭原则

开闭原则是指软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是对于修改是封闭的。用抽象构建框架,用实现实现细节。

也就是说我们如果想实现某种变化,不应该修改原类或模块实现相应的功能细节,而是对原类或模块实体进行扩张继承来具体实现某一变化。

如果要修改代码中某些逻辑实现细节的变化,尽量避开低层代码的逻辑,如果要修改低层代码,你要确定都有哪些高层次的代码使用了这些低层次代码,做统一的修改,低层次的代码的修改,肯定会引起高层次引用代码的变化,牵一发而动全身。所以尽量使用开闭原则,对原低层次代码进行扩展实现。

一句话理解:不要改老代码!写完全不用改的代码!

二、依赖倒置原则

依赖倒置原则(Dependence Inversion Principle,DIP)是面向对象编程和软件设计中的一个重要原则,它是开闭原则的一种具体实现方式。依赖倒置原则的核心思想是:高层模块不应该依赖于低层模块,它们都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

换句话说,要面向接口编程,不要面向实现编程。这里的抽象指的是接口或者抽象类,而细节则是指具体的实现类。依赖倒置原则强调将依赖关系颠倒过来,使得高层模块和低层模块都依赖于抽象,从而实现模块之间的解耦,提高代码的灵活性和可维护性。

依赖倒置原则是面向对象编程和软件设计中的一个重要原则,它强调将依赖关系颠倒过来,面向接口编程,从而实现模块之间的解耦,提高代码的灵活性和可维护性。

一句话理解:类的“朋友”(成员变量、方法的输入、输出参数)最好都是接口,面向接口编程!

三、单一职责原则

单一职责原则(Single Responsibility Principle,SRP)是面向对象编程和软件设计中的一个基本原则。它指出,一个类(或模块、函数等)只应该有一个引起变化的原因。换句话说,每个类应该只有一个职责,并且这个职责应该被完全封装在这个类的内部。

这个原则的核心思想是,通过将不同的职责分离到不同的类或模块中,可以使得代码更加清晰、可维护、可扩展和可重用。当一个类有多个职责时,这些职责之间可能会存在复杂的交互和依赖关系,导致代码难以理解和修改。而当一个类只有一个职责时,它的功能更加明确,更容易被其他开发人员理解和使用。

一句话理解:一个类只干一类事!精细化分工!

四、接口隔离原则

接口隔离原则(Interface Segregation Principle,ISP)是面向对象编程和软件设计中的一个重要原则。它要求程序员尽量将庞大和复杂的接口拆分成更小、更具体的接口,这样客户端只需要知道它们感兴趣的方法,而不必被迫依赖于它们不需要的方法。

ISP的主要观点是,一个类对另一个类的依赖性应当是建立在最小的接口上。换言之,不应该强迫客户端依赖于它们不使用的方法。通过为各个类建立它们需要的专用接口,可以使得系统更加灵活、可维护,并降低类之间的耦合性。

一句话理解:奥卡姆剃,如非必要勿增实体!用不上的接口就不要实现。

五、迪米特法则

迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。迪米特原则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称之为成员朋友类, 而出现在方法体内部的类不属于朋友类。

总的来说,迪米特法则是一种软件设计原则,它强调只与直接的朋友通信,通过限制软件实体之间通信的宽度和深度来降低类之间的耦合度,提高模块的相对独立性。但是,在使用时需要权衡利弊,避免过度使用导致系统复杂性增加。

一句话理解:除了成员变量、方法的输入、输出参数中的类外,尽量不引入更多的类。

迪米特法则优化前 TeamLeader类依赖了不是朋友的Course类

迪米特法则优化后 TeamLeader不再依赖Course

六、里氏替换原则

里氏替换原则(Liskov Substitution Principle,LSP)是面向对象编程中的一个重要原则,由芭芭拉·利科夫(Barbara Liskov)提出。这个原则指出,如果程序中使用基类对象的地方都可以使用其子类对象而不会引起错误,那么这个设计就是符合里氏替换原则的。

里氏替换原则的核心思想是:子类必须能够替换它们的父类。也就是说,在软件中,如果 S 是 T 的子类型,则程序中所有使用 T 类型的对象的地方都可以用 S 类型的对象来替换,而不会改变程序的期望行为。这意味着子类可以扩展父类的功能,但不能改变父类原有的功能。

一句话理解:可以扩展父类但是尽量不要重写父类的方法!

七、合成复用原则

合成复用原则(Composite Reuse Principle,CRP)又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。

合成复用原则的优点是可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。此外,使用组合或聚合关系可以将已有的对象纳入新对象中,使之成为新对象的一部分,从而达到复用的目的,同时新对象可以增加新的功能或行为。

一句话理解:尽量不使用继承优先考虑合成复用。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值