2023-02-22  阅读(378)
原文作者:键盘林 原文地址:https://blog.csdn.net/qq_37909508/category_8976362.html

设计原则:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则(最少知道原则)、里氏替换原则、合成/复用原则(组合/复用原则)

开闭原则

202302222056417821.png

开闭原则coding:

创建接口

202302222056429492.png

创建实现类

202302222056437853.png

主函数调用

202302222056452034.png

查看IDEA中UML结构图

202302222056462455.png

如果我们要添加一个打折功能的话

202302222056479806.png

在实现类中具体实现该方法

202302222056488187.png

但是这种方式还是存在很大的弊端,没有实现完美的解耦,这时候,去掉上面的修改,创建一个新的类

202302222056498278.png

重写父类方法

202302222056507129.png

我们可以看到运行后的结果打了8折

2023022220565158310.png

获取原价,从这里可以看到,我们完美的实现了解耦。

2023022220565268611.png

运行结果

2023022220565362012.png

当前UML结构图

2023022220565461613.png

总结来说:我们在添加需求的时候,只是添加在应用层添加类来实现,并没有动底层的任何一个类。这样就完美的实现了需求之间的解耦。提高了程序的可用性和复用性。

2023022220565580514.png

coding:

创建Geely对象,存在两个方法

2023022220565768415.png

在main方法中调用

2023022220565869416.png

如何需要添加学习新的课程就直接在Geely类上面添加

2023022220565972417.png

但是这种方式违背了依赖倒置原则,因为高层模块Test类需要调用方法的时候,却在底层模块Geely来添加方法

这时候我们创建一个接口,只是提供一个学习课程的方法,具体的实现由后面的来决定。

2023022220570069418.png

创建java课程类,来单独实现java课程学习方法

2023022220570135019.png

同理创建FECourse类来单独实现FE的课程方法

2023022220570217320.png

现在的话,我们将Geely类中之前的所有方法全部删掉

2023022220570305021.png

这样的话,对于具体要实现的课程直接交给高层模块来实现,底层模块相当于只是一个中转站。

2023022220570365222.png

重新修改主函数man方法

2023022220570452323.png

输出结果

2023022220570566624.png

查看当前UML类图

2023022220570662625.png

现在要添加一个学习课程方法就很简单了,只需要在添加一个类就可以实现了

2023022220570743026.png

这样的话只需要new出这个对象然后在调用这个方法就可以了。

2023022220570810227.png

运行结果

2023022220570901028.png

上面我们是通过调用方法来实现,现在我们也可以通过Geely的构造器来实现

去掉调用方法那里的产生,通过构造器来传入参数

2023022220570984729.png

main方法实现

2023022220571084230.png

这样的话也出现了一个问题,每创建一个课程对象就必须new一个geely对象。

2023022220571257831.png

2023022220571351532.png

当前UML类图

2023022220571503133.png

总结:我们可以看到在Geely类当中没有引入任何和课程有关的类,完全是一个单独的类,也就是说高层模块不依赖于低层模块,如果需要扩展只需要扩展底层模块类就可以了。 以抽象方式搭建的结构比你细节方式搭建的结构要稳定的多。其核心思想就是面向接口编程。

阅读全文
  • 点赞