前置介绍

软件开发,不管是前端还是后端,不管你用的是springboot还是django,uniapp还是mpvue,哪怕是数据库连接平台redis、mabits、hibernate,都或多或少用了设计原则。
你说你不会,不合理呀。

接下来给大家介绍一下我练习后的感悟。 提示:代码注释比较有用哦。

单一职责原则

代码奉上:

package singleresponsbility;/*** @author yzq* @projectName designdemo* @packageName singleresponsbility :一个类只能有一种职责 =》一个方法只能有一个职责。* @data 2020-09-06 09:*/
public class SingleResponsibility1 {public static void main(String[] args) {Vehicle vehicle = new Vehicle();vehicle.run("飞机");vehicle.run("汽车");}
}
/*违反了单一职责原则。
* 解决:
* 根据不同交通方法,分解成不同类
* */
class Vehicle{public void run(String args) {System.out.println(args+"在公路上运行");}
}

改良一

package singleresponsbility;/*** @author yzq* @projectName designdemo* @packageName singleresponsbility* @data 2020-09-06 09:*/
public class SingleResponsibility2 {public static void main(String[] args) {Vehicle2 vehicle = new Vehicle2();vehicle.run("汽车");Aircle2 aircle2 = new Aircle2();aircle2.run("飞机");}
}/*遵守单一职责原则,但是需要改动测试和执行类。
* 解决:
* 直接改动Vehicle类
* */
class Vehicle2{public void run(String args) {System.out.println(args+"在公路上运行");}
}class Aircle2{public void run(String args) {System.out.println(args+"在公路上运行");}
}

改良二

package singleresponsbility;/*** @author yzq* @projectName designdemo* @packageName singleresponsbility* @data 2020-09-06 09:*/
public class SingleResponsibility3 {public static void main(String[] args) {Vehicle3 vehicle = new Vehicle3();vehicle.airRun("飞机");vehicle.run("汽车");}
}/*在类上没有遵守单一职责原则,但是在方法上遵守单一职责原则
* 优点:
* 改变代码不大,对增加开发,对修改关闭
* */
class Vehicle3{public void run(String args) {System.out.println(args+"在公路上运行");}public void airRun(String args) {System.out.println(args+"在天空运行");}public void waterRun(String args) {System.out.println(args+"在水中运行");}
}

开闭原则

package opencloseeprinciple;/*** @author yzq* @projectName designdemo* @packageName opencloseeprinciple* @described 对拓展开放,对修改关闭 =>将共有方法抽象出接口。* @data 2020-09-06 14:07*/
public class OpenClosed1 {public static void main(String[] args) {Shape1 circle = new Circle();Shape1 rectangle = new Rectangle();new GraphicCreate().drawShape(circle);new GraphicCreate().drawShape(rectangle);//添加新的shape对象不改变其他实现类}
}class GraphicCreate{public void drawShape(Shape1 s){s.drawShape();}
}interface Shape1{public void drawShape();
}class Circle implements Shape1{public void drawShape(){System.out.println("画圆");}
}class Rectangle implements Shape1{public void drawShape(){System.out.println("画矩");}
}

里氏置换原则

package liskovsubstitution;/*** @author yzq* @projectName designdemo* @packageName liskovsubstitution:* @describe(子类不要随意修改父类;继承造成程序有侵入性,可移植性降低,尤其不能修改父类。)* @describe  =》所有引用父子类的都使用相同的基类对象,适当用聚合、组合、依赖解决问题;子类不要重写父类方法。* @data 2020-09-06 13:*/
public class Substitution {public static void main(String[] args) {Sus sus = new Sus();System.out.println(sus.add(2,3));}
}//采用聚合等方式避免重写
class Add {public int add(int a,int b){return a+b;}
}
class Sus{private Add a = new Add();//不继承不会重写Apublic int add(int a,int b){//使用组合完成功能实现return this.a.add(a,b);}
}

接口隔离原则

package interfacesegregation;/*** @author yzq* @projectName designdemo* @packageName interfacesegregation 一个雷对另一个类的依赖建立在最小的程度上* @data 2020-09-06 10:*/
public class segregation {public static void main(String[] args) {A a = new A();a.operation1();a.operation4();C c = new C();c.operation2();c.operation3();}
}//接口1
interface Interface1{void operation1();
}//接口2
interface Interface2{void operation2();void operation3();
}//接口3
interface Interface3{void operation4();void operation5();
}class B implements Interface1,Interface3{@Overridepublic void operation1() {System.out.println("B实现1");}@Overridepublic void operation4() {System.out.println("B实现4");}@Overridepublic void operation5() {System.out.println("B实现50");}
}class C implements Interface2,Interface1{@Overridepublic void operation1() {System.out.println("C 实现 1");}@Overridepublic void operation2() {System.out.println("C 实现 2");}@Overridepublic void operation3() {System.out.println("C 实现 3");}
}class A extends B{//如果AB功能是相同的使用这种方式比较少代码}

依赖倒置原则

package dependenceinversion;/*** @author yzq* @projectName designdemo* @packageName dependenceinversion: 细节依赖抽象;具体类实现抽象;高层与底层模块依赖抽象;中心思想=》依赖接口编程。* @data 2020-09-06 11:*/
public class Inversion1 {public static void main(String[] args) {/*该方式只能接受邮箱信息,不能接受其他类比如微信、qq信息* 优化:* 对接受信息抽象储接口* */Persion1 persion = new Persion1();Email1 email1 = new Email1();persion.receive(email1);}
}class Email1{public String getInfo(){return "电子邮件信息";}
}class Persion1{public void receive(Email1 email1){System.out.println("接收到:"+email1.getInfo());}
}

改良一

package dependenceinversion;/*** @author yzq* @projectName designdemo* @packageName dependenceinversion: 细节依赖抽象;具体类实现抽象;高层与底层模块依赖抽象;中心思想=》依赖接口编程。* @data 2020-09-06 11:*/
public class Inversion2 {public static void main(String[] args) {/*该方式能接受邮箱信息及其他类比如微信、qq信息* 优点:* 对信息进行抽象实现任意组装* *///接口方式Persion2 persion = new Persion2();EInfo email1 = new Email2();EInfo wchat = new Wechat();persion.receive(email1);persion.receive(wchat);//构造方法方式EInfo3 info3 = new Email3();Persion3 persion3 = new Persion3(info3);persion3.receive();//set方式EInfo4 info4 = new Wechat4();Persion4 persion4 = new Persion4();persion4.setInfo(info4);persion4.receive();}
}//抽象接口方式
class Email2 implements EInfo{public String getInfo(){return "电子邮件信息";}
}class Wechat implements EInfo{public String getInfo(){return "微信信息";}
}interface EInfo{String getInfo();
}
class Persion2{public void receive(EInfo info){System.out.println("接收到:"+info.getInfo());}
}//构造方法方式
class Email3 implements EInfo3{public String getInfo(){return "电子邮件信息";}
}class Wechat3 implements EInfo3{public String getInfo(){return "微信信息";}
}
interface EInfo3{String getInfo();
}class Persion3{private EInfo3 info;public Persion3(EInfo3 info){this.info =info;}public void receive(){System.out.println("接受到:"+this.info.getInfo());}
}//set方式
class Email4 implements EInfo4{public String getInfo(){return "电子邮件信息";}
}class Wechat4 implements EInfo4{public String getInfo(){return "微信信息";}
}
interface EInfo4{String getInfo();
}class Persion4{private EInfo4 info;public void setInfo(EInfo4 info) {this.info = info;}public void receive(){System.out.println("接受到:"+this.info.getInfo());}
}

迪米特法则

package demeterprinciple;import java.util.ArrayList;
import java.util.List;/*** @author yzq* @projectName designdemo* @packageName demeterprinciple* @describe 对象之间应保持最少了解,即减少耦合=》只与有耦合的对象通信,陌生的类不要以局部变量出现(成员变量,方法参数,方法返回值),耦合方式:依赖(弱关联,局域变量,方法形参)、关联(成员变量)、组合(has a)、聚合(强关联)、* @data 2020-09-06 14:*/
public class demeter1 {public static void main(String[] args) {Depatrment allDep = new AllDep();Depatrment schDep = new SchDep();School school = new School();school.setDepatrment(allDep);school.setDepatrment(schDep);school.findDep();}
}class School{private List<Depatrment> depatrment = new ArrayList<Depatrment>();public void setDepatrment(Depatrment depatrment) {this.depatrment.add(depatrment);}public void findDep(){for (Depatrment de :this.depatrment){de.getID();}}
}interface Depatrment{public  void  getID();
}class AllDep implements Depatrment{@Overridepublic void getID() {System.out.println("总部ID");}
}class SchDep implements Depatrment{@Overridepublic void getID() {System.out.println("学院ID");}
}

合成复用原则

package compositereuse;/*** @author yzq* @projectName designdemo* @packageName compositereuse* @describe 尽量使用合成/聚成,不使用继承* @data 2020-09-06 16:05*/
public class Reuse1 {}

总结

设计模式怎么搞更好:

  • 类独立出变化项,作为依赖,不要继承;
  • 面向接口;
  • 低耦合

不懂七大设计原则等于白学软件开发篇相关推荐

  1. 软件架构(软件体系结构)-设计原则篇(七大设计原则)

    软件架构(软件体系结构)-设计原则篇(七大设计原则) 1.软件架构设计原则概述 1.1.软件的可维护性 1.软件的维护 一个好的软件设计可维护性较好的系统,必须能够允许新的设计要求很容易地加入到已有的 ...

  2. 软件设计的七大设计原则

    一.前言 七大设计原则是23种设计模式的基础,体现了软件设计的思想,但并不是所有设计模式都遵循这七大设计原则,有些设计模式只遵循一部分设计原则,是对一些实际情况做的一些取舍.在我们项目中也并不一定完全 ...

  3. 面向对象(OOP)的七大设计原则

    如何学习设计模式                                                                                             ...

  4. 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)

    七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...

  5. java七大设计原则

    java七大设计原则 1.开闭原则(Open Close Principle) 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽 ...

  6. 设计模式 - 七大设计原则(一)

    设计模式 - 七大设计原则(一) 概述 简单介绍一下七大设计原则: 开闭原则:是所有面向对象设计的核心,对扩展开放,对修改关闭 依赖倒置原则:针对接口编程,依赖于抽象而不依赖于具体 单一职责原则:一个 ...

  7. 《区块链革命》读书笔记1可信的协议 引导未来:区块链经济七大设计原则

    更多内容欢迎戳进:我的个人博客 序一 区块链的核心是分布式而不是去中心.去中心是一个过程而不是一个结果,区块链是弱中心化的.分中心化的 区块链是分布式账本,而分布式账本不一定是区块链. 区块链在工程技 ...

  8. 区块链革命 - 第1篇 假如需要变革 - 第2章 区块链经济七大设计原则

    第2章 引导未来:区块链经济七大设计原则 我们现在对区块链的设计原则是建立在对现有互联网的批判.反思之上的,这些原则可能并不是真正的"原则",那现在让们回顾并总结这些原则 计算与通 ...

  9. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

最新文章

  1. 验证曲线( validation curve)是什么?如何绘制验证曲线( validation curve)?验证曲线( validation curve)详解及实践
  2. jquery.each读取json数据
  3. linux 安装 nodejs
  4. python3 打印异常堆栈信息
  5. 计算机常考应用分析题,计算机常见故障及排除
  6. 【技术综述】视频分类/行为识别研究综述,从数据集到方法
  7. crtsiii型无砟轨道板_为什么高铁轨道不像普快列车轨道那样铺碎石?
  8. 实现文件中名词的统计计数_通过勤哲EXCEL和Excel中的rank函数实现排名统计
  9. ACM学习历程—HDU5396 Expression(递推 计数)
  10. 用python延续科比的曼巴精神
  11. 最新添加了一键加入服务器的功能,功能介绍 - 晴天漫画系统 晴天漫画程序 基于标签的一套自动采集更新漫画系统...
  12. 苹果电脑上几款不错的矢量绘图工具
  13. 无法打开excel powermap 三维地图
  14. java shiro_shiro(java安全框架)
  15. 关于Palantir——第二部分:本体(Ontology)
  16. 笔记本的结构深入分析
  17. 如何利用SQL注入进行爆库
  18. 三种方法解决git拒绝连接问题fatal: unable to access xxxx: Failed to connect to xxxx : Connection refused
  19. 实现游戏中的轮廓描边
  20. 在阿里云的服务器linux下安装mysql和卸载mysql

热门文章

  1. 笔记管理工具EverNote
  2. 网站集成QQ号登录-QQ互联审核(附涉及不良信息解决办法)
  3. 百度收录查询 百度收录查询api源码
  4. [Git]如何解决Please commit your changes or stash them before you merge.
  5. 微信报告刷屏,原来80后已经开始老了……
  6. 送什么礼物实用、高性价比运动耳机推荐
  7. HANDLE HINSTANCE HWND等句柄的区别
  8. html字号24怎么设置,css怎么设置字体大小
  9. R语言使用aov函数进行单因素协方差分析(One-way ANCOVA)、验证协方差分析的回归斜率是否均匀(回归斜率在每个组中都是相同的、回归斜率的均匀性检验)
  10. Windows 安装 nvm