1.开闭原则

定义

一个软件实体如:类,模块,函数应该对扩展开放对修改关闭。 用抽象扩展框架,用实体扩展细节。

优点

提高软件系统的可复用性和可维护性。

coding

  1. // 课程抽象类
  2. public interface ICourse {
  3. Integer getId();
  4. String getName();
  5. Double getPrice();
  6. }
  7. // 课程实现类
  8. @Data
  9. @AllArgsConstructor
  10. public class JavaCourceImpl implements ICourse {
  11. private Integer id;
  12. private String name;
  13. private Double price;
  14. public Integer getId() {
  15. return this.id;
  16. }
  17. public String getName() {
  18. return this.name;
  19. }
  20. public Double getPrice() {
  21. return this.price;
  22. }
  23. }
  24. // 扩展功能 需要对java书籍进行打折处理
  25. public class JavaCourceSonImpl extends JavaCourceImpl {
  26. public JavaCourceSonImpl(Integer id, String name, Double price) {
  27. super(id, name, price);
  28. }
  29. /**
  30. * 现在有一个打折需求
  31. *
  32. * @return
  33. */
  34. @Override
  35. public Double getPrice() {
  36. return super.getPrice() * 0.8;
  37. }
  38. // 扩展方法:获取原价
  39. public Double getBeforePrice(){
  40. return super.getPrice();
  41. }
  42. }

满足开闭原则,在不破坏原有实现和原有接口的情况下实现原有实现类并且 重写/追加方法实现该功能。 image.png

2.依赖倒置原则

定义

使用单接口多实现的方式来 解决问题,而不要在接口中定义多个方法让一个实现类去实现其中所有方法。

planA

  1. // 定义科目接口
  2. public interface ICourse {
  3. void study();
  4. }
  5. // 分别实现这个接口
  6. public class JavaIcourse implements ICourse{
  7. public void study() {
  8. System.out.println("学习java");
  9. }
  10. }
  11. public class PythonIcourse implements ICourse {
  12. public void study() {
  13. System.out.println("学习python");
  14. }
  15. }
  16. // 根据传入抽象类的类型去动态决定是java还是python
  17. public class Llwmeme {
  18. public void studyJavaCource(ICourse iCourse){
  19. iCourse.study();
  20. }
  21. }

image.png

planB

  1. // 定义科目接口
  2. public interface ICourse {
  3. void study();
  4. }
  5. // 分别实现这个接口
  6. public class JavaIcourse implements ICourse{
  7. public void study() {
  8. System.out.println("学习java");
  9. }
  10. }
  11. public class PythonIcourse implements ICourse {
  12. public void study() {
  13. System.out.println("学习python");
  14. }
  15. }
  16. // 使用set 注入方式 好处是如果一次要调用两个无须new 两次
  17. public class Llwmeme {
  18. @Setter
  19. private ICourse iCourse;
  20. public void studyJavaCource(){
  21. iCourse.study();
  22. }
  23. }

image.png

3.单一职责原则

一个类只负责一件事情,如果一个类 负责了多件事情,导致多米诺骨牌 连锁 反映 会增加故障率。

4.接口隔离原则

定义

  1. 用多个专门的接口,而不使用单一的总接口,客户端不应该依赖他不需要的接口。
  2. 一个类对一个类的依赖应该建立在最小的接口上。
  3. 尽量细化方法接口中的方法尽量少。
  4. 意思是用多个小接口来写,因为如果写个大接口 就需要把这个接口所有的方法都实现了。

5.迪米特法则(最少知道原则)

定义

一个对象应该对其他对象保持最少了解,又叫最少知道原则。 尽量减少类于类的耦合性

6.里氏替换原则

定义

子类对象 能替换父类 对象 且逻辑不变。 反对子类重写父类方法。 子类可以扩展父类的功能,但不能改变父类原有的功能。

7.合成(组合)/聚合复用原则

定义

和开闭原则相反提倡一个类来管理