软件架构设计原则

软件架构设计原则

一、开闭原则

- 概述

开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。
开闭原则是指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。所以,所谓的开闭,也正是对扩展和修改两个行为的一个准则。

- 对扩展开放

所谓的对扩展开放,就是当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。
例如,现在商家需要搞活动,所有的食物都打八折。如果直接修改原有的模块(这里称为Food模块),那可能会影响其它模块的调用结果,可能给系统带来一定的风险。如果我们遵循开闭原则,不去修改Food模块,而是将Food模块扩展为新的DiscountFood模块,不仅灵活地实现了功能,还不会对系统造成风险。

- 对修改关闭
模块行为进行扩展时,不必改动模块的源代码或者二进制代码。
在现实生活中开闭原则也有体现。比如很多公司都实行弹性作息时间,规定每天工作8小时。就是说,每天8小时的工作是死的,但是你什么时候来、什么时候走是灵活的,只要工作够了8小时就可以了。

- 实现方法
开闭原则的核心思想就是面向抽象编程。
面向抽象编程就是把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。
综上所述,也可以说,开闭原则强调的是用抽象构建框架,用实现扩展细节。

- 优点
它指导了我们如何建立稳定、灵活的系统。在软件设计完成后,依然可以对软件进行扩展,增加新的功能或组件。同时在更新与维护过程中,抽象的底层不需要去修改,极大地方便了开发人员,增强了系统的稳定性和可延续性。

二、依赖倒置原则

- 概述
依赖倒置原则(DIP)是指设计代码结构时,高层模块不应该依赖低层模块,二者都应该依赖其抽象。简单的说就是要求对抽象进行编程,不要对实现进行编程。

- 依赖倒置原则的理解
在面向过程的开发过程中,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这不仅会大大提高开发成本,还会使程序有很高的耦合度。
面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度。
简单的来说就i是:抽象不应该依赖细节,细节应该依赖抽象。

- 举例
以计算机专业的学生要学习的课程为例。

public class Student {
   
    public void studyJavaCourse(){
   
        System.out.println("学生学习Java课程");
    }

    public void studyHtmlCourse(){
   
        System.out.println("学生学习Html课程");
    }
}

来调用一下

public static void main(String[] args) {
   
        Student student = new Student();
        student.studyJavaCourse();
        student.studyHtmlCourse();
    }

在这里插入图片描述
运行良好。但如果有一天,计算机的学生不需要学习前端了,所以把Html换成了Python,还增设了C++的课程。这本是课程体系的更改,但要实现此功能,居然要去修改学生(Student)模块,这太荒唐了。说到这里,这显然不是好的设计。原因就是学生(Student)和课程(Course)完全耦合,必须对它们进行解耦才行。
接下来我们优化代码,创建一个Course接口。

public interface Course {
   
    void study();
}

然后分别编写JavaCourse、PythonCourse和CppCourse

public class JavaCourse implements Course {
   
    @Override
    public void study() {
   
        System.out.println("学生学习Java课程");
    }
}
public class PythonCourse implements Course{
   
    @Override
    public void study() {
   
        System.out.println("学生学习Python课

你可能感兴趣的:(Spring的深深浅浅,java,软件架构,设计模式)