每次需求评审产品总是让我提高代码复用,说白了就是合成复用原则

前言

  • 原则是对我们的一种约束,按照约束开发前期可能会很通过。但是程序能够稳步的扩展及运行。面对程序开发时我们不能仅仅面对当下,还需考虑未来。
  • 合成复用原则也叫做组合/聚合复用原则。相信在前面的原则系列中大家不止一次听说过组合,聚合,依赖等关键词了吧。他们之间都是一种耦合的作用。你可以能又要说了不是说高内聚低耦合的。但是你要记住一点不管怎么低耦合。耦合还是会存在的。不耦合怎么叫做协同开发了。你不与人交流如何让别人知道你的想法呢?
  • 顾名思义合成复用原则他是想让我们能够复用我们的逻辑代码。在依赖时尽量使用组合,聚合的方式来实现功能的整合,其次才是使用继承的方式

image-20220429161953945.png

造汽车

 public class Common {
     public static void main(String[] args) {
         new WhileElectricCar().driver();
         new RedElectricCar().driver();
         new WhilePertolCar().driver();
         new RedPertolCar().driver();
     }
 }
 class Car{
     public void driver() {
         System.out.println("我是汽车,可以行驶");
     }
 }
 ​
 class PertolCar extends Car {
     @Override
     public void driver() {
         System.out.println("我是汽油汽车,正在行驶");
     }
 }
 ​
 class WhilePertolCar extends PertolCar {
     @Override
     public void driver() {
         System.out.println("我是白色的汽油汽车,正在行驶");
     }
 }
 ​
 class RedPertolCar extends PertolCar {
     @Override
     public void driver() {
         System.out.println("我是红色的汽油汽车,正在行驶");
     }
 }
 class ElectricCar extends Car {
     @Override
     public void driver() {
         System.out.println("我是电力汽车,正在行驶");
     }
 }
 ​
 class WhileElectricCar extends ElectricCar {
     @Override
     public void driver() {
         System.out.println("我是白色的电力汽车,正在行驶");
     }
 }
 ​
 class RedElectricCar extends ElectricCar {
     @Override
     public void driver() {
         System.out.println("我是红色的电力汽车,正在行驶");
     }
 }
复制代码
  • 上面代码像我们展示了如何制造汽车。可想而知当我们汽车种类和颜色种类越来越多的情况下,我们的子类也会越来越多。对应的UML图示如下

image-20220502161235813.png

  • 按照这样的发展,子类会越来越多不利于我们的管理,而且对我们的代码改动行也是非常大的。不够灵活。假如我们除了颜色和车行驶能源角度还有是否自动这个参数,那么我们所有的子类都得重新编写。这无疑是不可取的,无疑也是代码不够灵敏的。

合成复用

  • 针对上面我们提到的问题,我们进行如下修改
 public class Hecheng {
     public static void main(String[] args) {
         Color redColor = new Color() {
             @Override
             public String getCurrentColor() {
                 return "红色";
             }
         };
         Color whileColor = new Color() {
             @Override
             public String getCurrentColor() {
                 return "白色色";
             }
         };
         Color blackColor = new Color() {
             @Override
             public String getCurrentColor() {
                 return "黑色";
             }
         };
         PertolCar pertolCar1 = new PertolCar(redColor);
         PertolCar pertolCar2 = new PertolCar(whileColor);
         PertolCar pertolCar3 = new PertolCar(blackColor);
         ElectricCar electricCar1 = new ElectricCar(redColor);
         ElectricCar electricCar2 = new ElectricCar(whileColor);
         ElectricCar electricCar3 = new ElectricCar(blackColor);
         pertolCar1.driver();
         pertolCar2.driver();
         pertolCar3.driver();
         electricCar1.driver();
         electricCar2.driver();
         electricCar3.driver();
     }
 }
 ​
 interface Color{
     public String getCurrentColor();
 }
 ​
 class Car{
     private Color color;
 ​
     public Color getColor() {
         return color;
     }
 ​
     public void setColor(Color color) {
         this.color = color;
     }
 ​
     public Car(Color color) {
         this.color = color;
     }
     public void driver() {
         System.out.println(this.color.getCurrentColor()+"我是汽车,可以行驶");
     }
 }
 ​
 class PertolCar extends Car {
     public PertolCar(Color color) {
         super(color);
     }
 ​
     @Override
     public void driver() {
         System.out.println(getColor().getCurrentColor()+"我是汽油汽车,正在行驶");
     }
 }
 ​
 class ElectricCar extends Car {
     public ElectricCar(Color color) {
         super(color);
     }
 ​
     @Override
     public void driver() {
         System.out.println(getColor().getCurrentColor()+"我是电动汽车,正在行驶");
     }
 }
复制代码
  • 如果代码看到比较凌乱,我这里整理了下对应的UML图。应该看这比较清晰点。

image-20220505090520336.png

小结

  • 我们总是说面向接口编程。不管是接口也好,还是抽象也罢。我们的目的只有一个提高程序的复用性。复用性提高了自然就减少了同类的产生。也提高了我们对代码的维护性

设计原则总结

  • 到这里我们所有的设计原则已经全部梳理完了。【单一职责】【接口隔离原则】【依赖倒转原则】【里氏替换原则】【开闭原则】【迪米特法则】【合成复用原则】七大设计原则
  • 这些原则是我们在设计初期尽量遵循的。但是我们需要看清一个事实,我们没必要也没法完全的遵从这些设计原则。因为在实际的场景中除了代码的优雅我们还需要考虑成本。

以下总结取自于网络【语言中文网】

设计原则 一句话归纳 目的
1⃣️单一职责原则 一个类只干一件事,实现类要单一 便于理解,提高代码的可读性(降低复杂度)
2⃣️接口隔离原则 一个接口只干一件事,接口要精简单一 功能解耦,高聚合、低耦合
3⃣️依赖倒置原则 高层不应该依赖低层,要面向接口编程 更利于代码结构的升级扩展
4⃣️里氏替换原则 不要破坏继承体系,子类重写方法功能发生改变,不应该影响父类方法的含义 防止继承泛滥,子类必须遵从父类的设计
5⃣️迪米特法则 不该知道的不要知道,一个类应该保持对其它对象最少的了解,降低耦合度 只和朋友交流,不和陌生人说话,减少代码臃肿
6⃣️开闭原则 对扩展开放,对修改关闭 降低维护带来的新风险
7⃣️合成复用原则 尽量使用组合或者聚合关系实现代码复用,少使用继承 降低代码耦合
  • 学习设计模式最好的方式我觉得还是去看源码。工作这么多年没见过同事运用设计模式去开发的。唯一见到的就是在源码中

\

猜你喜欢

转载自juejin.im/post/7095541196361039879