本文源码:GitHub·点这里 || GitEE·点这里

文章目录

  • 一、单一职责原则
  • 二、接口隔离原则
  • 三、依赖倒转原则
  • 四、里氏替换原则
  • 五、开闭原则
  • 六、迪米特原则
  • 七、设计原则总结
  • 八、源代码地址

一、单一职责原则

1、概念描述

对类来说的,即一个类应该只负责一项职责。如果一个类负责两个职责,可能存在职责1变化,引起职责2变化的情况。可以基于抽象逻辑,或者业务逻辑对类进行细化。

2、案例演示

这里基于方法和类的细化都可以,可以根据实际业务选择。

class Animal {public void dogVoice (){System.out.println("狗叫声:旺旺");}public void cowVoice (){System.out.println("牛叫声:哞哞");}
}
class DogVoice {public String getDogVoice (){return "旺旺" ;}
}
class CowVoice {public String getCowVoice (){return "哞哞" ;}
}

3、注意事项

减少代码一处变更引起的程序大规模改动情况,降低类的复杂度,提高类的可读性,可维护性。通常情况下,需要遵守单一职责原则,可以适当违反单一职责原则。

二、接口隔离原则

1、概念描述

客户端不应该依赖它不需要的接口,一个类对另一个类的依赖,应该建立在最小的接口上。

2、案例演示

interface ReadBlog {String getBlog () ;
}
interface AdminBlog {Boolean insertBlog () ;Boolean updateBlog () ;Boolean deleteBlog () ;
}
/*** 读者只开放博客阅读接口*/
class Reader implements ReadBlog {@Overridepublic String getBlog() {return null;}
}
/*** 管理员有博客全部的管理权限*/
class AdminUser implements AdminBlog,ReadBlog {@Overridepublic String getBlog() {return null;}@Overridepublic Boolean insertBlog() {return null;}@Overridepublic Boolean updateBlog() {return null;}@Overridepublic Boolean deleteBlog() {return null;}
}

3、注意事项

接口的设计粒度越小,则应用系统程序越灵活,程序变得灵活也就意味同时结构复杂性提高,开发开发和理解的难度也会变大,可维护性降低。

三、依赖倒转原则

1、概念描述

高层模块不应该依赖低层模块,两者应依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象;中心思想是面向接口编程。

2、案例演示

public class C01_FarmFactory {public static void main(String[] args) {Animal animal = new Dog() ;FarmFactory farm = new Farming() ;farm.breed(animal) ;animal = new Pig() ;farm.breed(animal) ;}
}
/*** 接口声明依赖对象*/
interface FarmFactory {void breed (Animal animal) ;
}
class Farming implements FarmFactory {@Overridepublic void breed(Animal animal) {System.out.println("农场饲养:"+animal.getAnimalName());}
}
interface Animal {String getAnimalName () ;
}
class Dog implements Animal {@Overridepublic String getAnimalName() {return "牧羊犬";}
}
class Pig implements Animal {@Overridepublic String getAnimalName() {return "土猪一号";}
}

3、注意事项

相对于系统开发的多变性,抽象的相对稳定。以抽象为基础搭建的架构比以细节为基础的架构要稳定灵活。下层模块尽量都要有抽象类或接口,程序稳定性更好。变量的声明类型尽量是抽象类或接口,这样变量引用和实际对象之间存在一个过渡空间,利于程序扩展和优化。

四、里氏替换原则

1、概念描述

假设如下场景:

  • 存在,一个类型T1,和实例的对象O1
  • 存在,一个类型T2,和实例的对象O2

如果将所有类型为T1的对象O1都替换成类型T2的对象O2,程序的行为不发生改变。那么类型T2是类型T1的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。

2、案例演示

public class C01_Calculate {public static void main(String[] args) {BizCalculate bizCalculate = new BizCalculate() ;System.out.println(bizCalculate.add(2,3));}
}
class Calculate { }
class BaseCalculate extends Calculate {public int add (int a,int b){return a+b;}
}
/*** 这里使用组合的方式完成计算*/
class BizCalculate extends Calculate {private BaseCalculate baseCalculate = new BaseCalculate() ;public int add (int a,int b){return this.baseCalculate.add(a,b);}
}

3、注意事项

使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法;子类可以扩展父类的功能,但不能改变原有父类的功能;在适当的情况下,可以通过聚合,组合,依赖等方式解决问题。

五、开闭原则

1、概念描述

开闭原则是编程中最基础、最重要的设计原则,在代码结构的设计设计时,应该考虑对扩展开放,对修改关闭,抽象思维搭建结构,具体实现扩展细节。

2、案例演示

public class C01_BookPrice {public static void main(String[] args) {ParityBook parityBook = new DiscountBook("Java",100.00) ;System.out.println(parityBook.getPrice());}
}
interface Book {String getName () ;Double getPrice () ;
}
/*** 平价书籍*/
class ParityBook implements Book {private String name ;private Double price ;public ParityBook(String name, Double price) {this.name = name;this.price = price;}@Overridepublic String getName() {return this.name ;}@Overridepublic Double getPrice() {return this.price ;}
}
/*** 打折数据扩展价格计算策略*/
class DiscountBook extends ParityBook {public DiscountBook(String name, Double price) {super(name, price);}@Overridepublic Double getPrice() {double oldPrice = super.getPrice();return oldPrice * 0.8 ;}
}

3、注意事项

基于开闭原则设计的代码结构可以提高复用性和可维护性,通过接口或抽象类可以约束类的变化行为,基于指定策略对变化行为进行封装,并且能够实现对扩展开放,使用设计模式的基本原则就是遵循开闭原则。

六、迪米特原则

1、概念描述

迪米特原则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外开放任何信息。类与类关系越密切,耦合度越大,耦合的方式很多,依赖,关联,组合,聚合等。

  • 直接朋友概念

两个对象之间有耦合关系,就说这两个对象之间是朋友关系。其中出现成员变量,方法参数,方法返回值中的类称为直接朋友,而出现在局部变量中的类不是直接朋友。从原则上说,陌生的类最好不要以局部变量的形式出现在类的内部。

2、案例演示

public class C01_Employee {public static void main(String[] args) {HeadCompanyEmpManage empManage = new HeadCompanyEmpManage() ;BranchCompanyEmpManage branchEmp = new BranchCompanyEmpManage() ;empManage.printEmp(branchEmp);}
}
/*** 总公司员工*/
class HeadCompanyEmp {public String name ;public HeadCompanyEmp(String name) {this.name = name;}@Overridepublic String toString() {return "HeadCompanyEmp{name='" + name + '}';}
}
/*** 分公司员工*/
class BranchCompanyEmp {public String name ;public BranchCompanyEmp(String name) {this.name = name;}@Overridepublic String toString() {return "BranchCompanyEmp{name='" + name + '}';}
}
/*** 分公司员工管理*/
class BranchCompanyEmpManage {// 添加分公司员工public List<BranchCompanyEmp> addEmp (){List<BranchCompanyEmp> list = new ArrayList<>() ;for (int i = 1 ; i <= 3 ; i++){list.add(new BranchCompanyEmp("分公司员工"+i)) ;}return list ;}// 获取分公司员工public void printBranchCompanyEmp (){List<BranchCompanyEmp> list = addEmp () ;for (BranchCompanyEmp emp:list){System.out.println(emp);}}
}
/*** 总公司员工管理,基于迪米特原则,不出现陌生类*/
class HeadCompanyEmpManage {// 添加总公司员工public List<HeadCompanyEmp> addHeadEmp (){List<HeadCompanyEmp> list = new ArrayList<>() ;for (int i = 1 ; i <= 3 ; i++){list.add(new HeadCompanyEmp("总公司员工"+i)) ;}return list ;}public void printEmp (BranchCompanyEmpManage empManage){// 打印分公司员工empManage.printBranchCompanyEmp();List<HeadCompanyEmp> headEmpList = addHeadEmp () ;for (HeadCompanyEmp headCompanyEmp:headEmpList){System.out.println(headCompanyEmp);}}
}

3、注意事项

迪米特原则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此可以降低耦合关系。降低耦合关系,并不是要求完全没有依赖关系,过度的使用迪米特原则,容易产生大量的中间类,导致复杂度变大。所以在使用迪米特原则时要根据实际业务权衡。

七、设计原则总结

设计模式和设计原则的核心思想都是:判断业务应用中可能会变化模块,并且把这些模块独立出来,基于指定的策略进行封装,不要和那些变化的不大的模块耦合在一起,封装思想上基于接口和抽象类,而不是针对具体的实现编程。核心目的就是降低交互对象之间的松耦合度。设计模式和原则都不是可以生搬硬套的公式,个人理解:只要形似,神韵就自然不差。

八、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

软件工程六大设计原则总结,案例演示相关推荐

  1. 软件工程六大设计原则

    1.单一职责原则 概念描述 对类来说,一个类应该只负责一项职责.如果一个类负责两个职责,可能存在职责1变化,引起职责2的变化情况.可以基于抽象逻辑,或者业务逻辑对类进行细化. 2.接口隔离原则 概念描 ...

  2. 设计模式必备知识点----六大设计原则

    六大设计原则 一,开闭原则 开闭原则的定义 什么是开闭原则 开闭原则的作用 开闭原则的优点 二,单一职责原则 单一职责定义 单一职责的作用 单一职责的优点 单一职责的违背原则 三,依赖倒置原则 依赖倒 ...

  3. 设计模式的六大设计原则

    设计模式的六大设计原则 1. 开闭原则 1.1 开闭原则:Open Closed Principle,OCP 1.2 开闭原则的作用 2. 单一责任原则 2.1 单一职责原则:Single respo ...

  4. 设计模式-六大设计原则(附加实际开发建议以及计算器例子)

    使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.设计模式使代码编制真正工程化,是软件工程的基石脉络,如同大厦的结构一样. 文章结构: 1.单一职责原则(SRP): 2.里氏替换原 ...

  5. IOS设计模式的六大设计原则之开放-关闭原则(OCP,Open-Close Principle)

    定义 一个软件实体(如类.模块.函数)应当对扩展开放,对修改关闭. 定义解读 在项目开发的时候,都不能指望需求是确定不变化的,大部分情况下,需求是变化的.那么如何应对需求变化的情况?这就是开放-关闭原 ...

  6. [转] 设计模式的六大设计原则

    转载说明: 感谢原作者吕震宇老师的分享. 原文参考链接:https://www.cnblogs.com/zhenyulu/category/6930.html? 本次转载只用于个人学习使用,并不涉及商 ...

  7. 【0718作业】收集和整理面向对象的六大设计原则

    面向对象的六大设计原则 (1)单一职责原则--SRP (2)开闭原则--OCP (3)里式替换原则--LSP (4)依赖倒置原则--DIP (5)接口隔离原则--ISP (6)迪米特原则--LOD - ...

  8. 设计模式三大类及六大设计原则

    设计模式分为三大类: 创建型模式,共五种: 单例模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式 结构型模式,共七种: 适配器模式 装饰模式 代理模式 外观模式 桥接模式 组合模式 享元模式 行 ...

  9. 引用防删——JAVA设计模式总结之六大设计原则

    JAVA设计模式总结之六大设计原则 从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9 ...

最新文章

  1. 获取当前时间日期并格式化--JS
  2. 全球及中国斜交胎市场品牌竞争形势与投资策略分析报告2022年
  3. 初学__Python——Python 自定义函数
  4. 更深的编码器+更浅的解码器=更快的自回归模型
  5. 二阶龙格库塔公式推导_DeepFM原理推导
  6. 第三次学JAVA再学不好就吃翔(part42)--内部类概述
  7. 【C++】智能指针详解
  8. 华为户外模式怎么设置_华为FreeLace Pro降噪器效果怎么样?降噪开启和设置教程!...
  9. [转载] python divmod()函数
  10. JVM 大厂面试都会问,都会这么问,你能顶住么?
  11. linux文件名变量,文件名通配符、变量以及管道知识点的总结
  12. 动感歌词制作与转换工具(QRC, KRC, LRC, KSC, TRC) 1.2.9版本
  13. 用小程序做问卷调查,获取数据就是这么简单!
  14. matlab输出 inf,为什么输出的是-inf,不应该是个值吗
  15. Electron安装报错解决办法
  16. Windows 11镜像文件
  17. wamp服务器离线 所有服务正常运行_你在使用开票软件的时候“突然”!发生“离线发票”我给你支几招...
  18. php转换java工具_6款程序员必备的开源中文汉字拼音转换及处理工具 (PHP Java .net)...
  19. css只设置背景图片半透明,css3实现背景图片半透明内容不透明的方法示例
  20. 查询字体文件所包含的文字

热门文章

  1. loadrunner脚本录制为空的解决方法
  2. 计组之数据运算:8、c语言之强制类型转化、数据的存储与排序(大小端、字节对齐)
  3. 数据结构之图的存储结构:邻接表法
  4. poj2965 The Pilots Brothers' refrigerator
  5. crontab命令使用记录(精,反弹shell)
  6. golang错误:The process cannot access the file because it is being used by another process
  7. Windows编程—Windows驱动开发环境搭建
  8. [心得]编写服务端的相关设计心得及体会
  9. 关于Netbeans调试PHP
  10. JavaEE实战班第十天