前言

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

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

造汽车

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图示如下

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

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

合成复用

  • 针对上面我们提到的问题,我们进行如下修改
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图。应该看这设计模式之禅比较清晰点。

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

小结

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

设计原则总结

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

以下总结取自于网络设计模式之禅【语言中文网】

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