七种软件架构设计原则

《Spring核心原理》学习笔记

tips:spring 设计模式 核心原理

一、七种软件架构设计原则

1、开闭原则(Open Closed Principle OCP)

  • 内容:对扩展开放,对修改关闭
  • 举例:类图如下所示,创建课程ICourse接口,不同课程创建不同类JavaCourse实现接口,如果出现课程降价,不在原有类中修改getPrice方法,而是重新扩展新类JavaDiscountCouse继承该类,并重写价格方法getPrice。而这种方式是违背了里氏替换原则,因此最好的方式是重写一个方法getDiscountPrice。
    在这里插入图片描述

2、依赖倒置原则(Dependency Inversion Principle DIP)

  • 内容:
    • 程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象编程,不要对实现编程,从而降低了客户与实现模块间的耦合。(公共方法且不依赖具体实现的抽象为静态类,公共方法且依赖具体实现的抽象为接口类)
    • 与Spring的依赖注入是一个含义
  • 举例:类图如下所示,创建课程ICourse接口,不同课程实现ICourse接口,Tom类可以通过依赖注入的方式调用不同的课程实现类(依赖注入三种方式:传参、构造器、Setter方法)
    在这里插入图片描述

3、单一职责原则(Simple Responsibility Principle,SRP)

  • 内容:不存在多于一个导致类变更的原因。即如果一个类负责不同的职责,则将不同的职责拆分为不同的类。
  • 注释:单一原则在使用过程中,不太容易实现,不能保障所有的类或者方法都是单一功能,但是我们要尽量保障,能够减轻后期运维成本。同时DAO模型中,为什么一个类有四个不同的方法(增删改查),因为DAO的基本操作就这四种,所以不需要对不同方法进行拆分(即对于后期不宜改动的代码不需要进行拆分)。

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

  • 内容:使用多个专用的接口,而不是使用单一的汇总接口,即类不需要实现其不需要的接口。
  • 举例:类图对比如下所示,动物接口IAnimal有eat、run、fly和swim三个接口,他们都有个共同的方法就是eat,但是陆海空三种不同的动物有不同的运动方式,因此不能定义统一的接口,应该进行拆分。
    在这里插入图片描述

5、迪米特原则(Law of Demeter,Lod)

内容:一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),强调只和朋友交流不和陌生人说话。朋友即成员变量、方法的输入和输出参数中的类
举例:类图对比如下所示,老板Boss需要查看发布的课程Course数量,因此想TeamLeader去统计,TeamLeader将结果告诉给Boss,Boss不需要知道课程Course信息,其方法参数只需要传TeamLeader,因此和TeamLeader是朋友,与Course不是朋友,因此要避免在方法内部引入Course类。而TeamLeader的方法参数包含Course,因此与Course是朋友,因此应该将Course信息创建放在TeamLeader中。第一种方式在Boss中创建课程信息,传给了TeamLeader,这种方式不符合迪米特原则。
在这里插入图片描述

6、里氏替换原则(Liskow Substitution Principle,LSP)

  • 内容:

    • 继承优点:
      • 提高代码的重用性,子类拥有父类的方法和属性;
      • 提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性;
    • 继承缺点:
      • 侵入性:继承是侵入性的,只要继承就必须拥有父类的所有方法和属性;
      • 不够灵活:在一定程度上约束了子类,降低了代码的灵活性;
      • 高耦合:增加了耦合,当父类的常量、变量或者方法被修改了,需要考虑子类的修改,所以一旦父类有了变动,很可能会造成非常糟糕的结果,要重构大量的代码。
  • 原则:继承复用的基石,只有当衍生类可以替换基类,功能不受到影响时,即基类随便怎么改动子类都不受此影响,那么基类才能真正被复用。

  • 具体方法(保障子类替换父类代码结果一致):

    • 子类必须实现父类的抽象方法,但不得覆盖父类的非抽象(已实现)方法。
    • 子类中可以增加自己特有的方法
  • 当子类重写父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松

  • 当子类重写父类方法或实现父类的抽象方法时**,方法的后置条件(即方法的返回值)要比父类更严格**。

7、合成复用原则(Composite/Aggregate Reuse Principle,CARP)

内容:尽量使用对象组合(has-a)/聚合(contains-a),而不是继承关系,降低类之间耦合性。

发布了10 篇原创文章 · 获赞 2 · 访问量 1925

猜你喜欢

转载自blog.csdn.net/yuhao22/article/details/105619370