设计模式-七大原则

  • 开闭原则
    开闭原则(Open Closed Principle,OCP)由勃兰特·梅耶在1988年的著作《面向对象软件构造》中提出:软件实体应当对拓展开放,对修改关闭(Software entities should be open for extension, but closed for modification)。
    软件实体包括以下几个部分
1:项目中划分出的模块
2:类与接口
3:方法

含义:当应用的需求改变时,在不修改软件实体的源代码或者二进制码的前提下,可以拓展模块的功能,使其满足新的需求。
作用:开闭原则是面向对象程序设计的终极目标,它使软件实体有一定的适应性和灵活性的同时具备稳定性和延续性。

1. 只需要对拓展的代码进行测试即可,因为原有的测试代码依然能够运行。
2. 粒度越小,被复用的可能性就越大。
3. 遵守开闭原则,稳定性和延续性强。易于维护。
  • 里氏替换原则
    里氏替换原则(Liskov Substitution Principle , LSP) 由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在1987年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)中提出来的。她认为:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。
    定义:
    里氏替换原则主要阐述了有关继承的一些原则,也就是什么时候应该使用继承。里氏替换原则是继承复用的基础,它反映了基类与子类之间的关系,是对开闭原则的补充,是对实现抽象化的具体步骤的规范。
    实现方法:
    通俗的讲就是子类可以拓展父类的功能,但不能改变父类原有的功能。
    例子:飞鱼不是鱼,所以不能继承鱼那个类

  • 依赖倒置原则
    依赖倒置原则(Dependence Inversion Principle , DIP)是Object Mentor 公司总裁罗伯特·马丁于1996年在C++ Report上发表的文章。
    原始定义:

高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。
(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)

核心思想就是,面向接口编程,而不是面向实现编程。
依赖倒置原则实现方法:
该原则的目的是要通过面相接口的编程来降低类间的耦合性。

1. 每个类尽量提供接口或抽象类,或者两者都提供
2. 变量的声明类型尽量是接口或者是抽象类
3. 任何类都不应该从具体类new
4. 使用继承时尽量遵循里氏替换原则

例子:顾客去商店买东西,顾客类的购买方法不应使用具体的商店实现类,而使用商店接口。商店分别实现该接口并复写其方法。

  • 单一职责原则
    单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,是由罗伯特·马丁于《敏捷软件开发》中提出的,这里的职责指的是类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。
    如果一个对象承担了太多的职责(功能)。至少存在以下两个缺点
1. 一个职责的变化可能会削弱或者抑制这个类实现其他功能的能力。
2. 当调用者需要该对象的某一个功能的时候,不得不将其他不需要的功能全部包含进来,从而造成冗余代码。

优点:

1. 复杂度降低
2. 可读性高
3. 可维护性高

实现方法:
将类中不用的功能进行拆分,封装到不同的类或模块中
注:该原则同样适用于方法,一个方法处理的东西过多,细粒度会变粗,不利于重用。

  • 接口隔离原则
    接口隔离原则(Interface Segregation Principle,ISP)要求尽量将臃肿的接口拆分成更小和更具体的接口。

  • 迪米特法则
    迪米特法则(Law of Demeter,LoD)又叫最少知识原则,来自于美国东北大学一个叫迪米特的项目。
    定义:
    只与朋友交谈,不跟陌生人说话(Talk only to your immediate friends and not to strangers)
    具体含义是两个软件如果无需直接通信,那就不应该直接调用,而是通过第三方转发调用。
    优点:

1. 降低耦合度,提升独立性
2. 耦合度降低后提升了拓展性

缺点:

1. 会产生大量的中介类,增加系统复杂性
2. 通讯效率变低

例子:MQ消息队列,或者明星-经纪人-粉丝之间的关系

  • 合成复用原则
    合成复用原则(Composite Reuse Principle,CRP)要求在软件复用时,先考虑使用组合或聚合等关联关系来实现。其次才考虑使用继承关系来实现。
    注:使用合成复用原则的时候要严格遵守里氏替换原则。
    复用分为继承和组合两种:
    继承复用虽然简单易实现但是也有以下缺点:
1. 破坏了类的封装性
2. 父子类耦合度高
3. 限制了复用的灵活性,因为继承的时候是静态的,在编译期已经定义。所以运行时不可能发生变化

组合复用的优点:

1. 维持了类的封装性
2. 耦合度低
3. 灵活度高,可以在运行时动态进行,新对象可以动态的引用

例子:汽车类包含color类,电动汽车和燃油汽车继承汽车类。这样就有了不同颜色的两种汽车

原则总结:

截屏2022-05-11 16.36.39.png

你可能感兴趣的:(设计模式-七大原则)