网站首页 > 精选教程 正文
软件架构设计七大原则
软件架构设计七大原则
1,开闭原则
2,依赖倒置原则
3,单一职责原则
4,接口隔离原则
5,迪米特原则
6,里氏替换原则
7,合成复用原则
1,开闭原则
开闭原则(Open-Closed Principle,OCP)指一个软件实体如类,模块和函数应该对扩展开放,对修改关闭,以提高系统的复用性和可维护性。在功能改动或升级时,尽可能的不修改源码,而是通过继承实现类的方式实现新功能,有种热插拔的效果。而这些都可以通过接口和抽象类实现,也就是面向抽象编程。
如图:当我们的java课程需要打折时,不需要直接修改java课程中的价格方法,而是通过打折类super.getPrice()调用父类方法实现。而能这样做的前提是,我们的getPrice方法是由顶层的接口提供,他也没有改变java课程这个对象。
2,依赖倒置原则
依赖倒置原则(Dependency Inversion Principle,DIP)指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。通过依赖倒置,降低类与类之间的耦合性。
如图:当tom开始想学python课程时,只需要新建1个python类实现课程接口,tom在选择课程时只需要传入接口参数,由接口自己去选择需要实例化的课程。这也就是依赖注入——构造器(每次构造都有一个实例)或setter方式。图中tom和课程接口有一个组合关系。
3,单一职责原则
单一职责原则(Simple Responsibility Principle,SPR)指一个类、接口、方法应该只维护一个功能,以防止需求变更时,修改某个方法而导致其他方法受影响的情况,目的是降低程序的复杂度和耦合性。
如图,原有的课程接口有获取课程信息和管理课程两大方法,我们改造成两个接口,分别负责自己的事情;类也是一样,课程类有有直播录播两种方法,同样拆分成两个。
4,接口隔离原则
接口隔离原则(Interface Segregation Principle,ISP)指用多个专门的接口,而不使用单一的接口,避免接口过于臃肿。设计接口原则:一个类对另一个类的依赖应该建立在最小的接口上,避免实现接口时还要实现他不需要的方法。要尽可能的细化接口,要符合高内聚,低耦合的设计思想。
如图:当我们直接使用IAnimal接口时,子类不得不实现它不需要的方法。
5,迪米特原则
迪米特原则(Law of Demeter,LoD)又叫做最少知道原则(Least Knowledge Principle,LKP)指一个对象应该对其他对象保持最少的了解,降低类间的耦合。比如不允许其他类出现在本类的方法中。
如图:leader想要知道课程学习者的数量,这时员工就要有一个查询方法,负责统计课程。但是leader在调用时他并不需要知道课程,课程应该是员工需要知道的,他只想知道结果,所以进行了向右边的解耦。
6,里氏替换原则
里氏替换原则(Liskow Substitution Principle,LSP)指一个软件实体可以如果适用父类,那么一定适用其子类。子类可以扩展父类的功能,而不能改变父类原有的功能。具体来说:
- 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法;
- 子类可以增加自己特有的方法;
- 当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类更宽松;
- 当子类的方法实现父类的方法时,方法的后置条件(即方法的输出返回值)要比父类的更严格或相等。
7,合成复用原则
合成复用原则 (Composite/Aggregate Reuse Principle,CARP)指尽可能使用对象组合(has-a)或对象聚合(contains-a)的方式实现代码复用,而不是用继承关系达到代码复用的目的。(也就是我们上节讲的,组合的耦合性要弱于继承)
继承,又称为白盒复用,相当于把实现细节暴露给了子类;组合/聚合为黑盒复用,类以外的对象是无法获得实现细节的。
如图:将产品添加到 MySQL 数据库,也方便扩展到 ORACLE 数据库。同时,Dao 层不用关心如何获取 ORACLE 连接,连接对它也不可见。
需要知道的是,设计原则只是我们生产实践中力求争取的原则。它需要综合考虑人力、成本、周期、质量等问题,在适当场合遵循设计原则将提升系统构建质量。
猜你喜欢
- 2024-11-02 Java,设计模式,七大原则,里氏替换原则(LSP),案例
- 2024-11-02 软件设计七大原则,程序员标配(一)
- 2024-11-02 设计模式七大原则 设计模式七大原则包括
- 2024-11-02 Java设计模式的精神领袖:开闭原则
- 2024-11-02 设计模式第2招第3式之命令模式 命令模式定义
- 2024-11-02 Java代码优化六大原则 java代码优化六大原则有哪些
- 2024-11-02 专门画了9张图,搞懂设计模式6大原则,这次应该可以了吧
- 2024-11-02 程序员应知道这十大面向对象设计原则
- 2024-11-02 3张图说清楚:java设计模式原则:开闭、接口隔离、迪米特法则
- 2024-11-02 Java 设计原则与思想:高内聚和低耦合
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)