6个设计原则

单一职责原则

接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

里氏替换原则

所有引用基类的地方必须能透明地使用其子类的对象。

即:只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。

  1. 子类必须完全实现父类的方法

如果子类不能完整地实现父类的方法,或者父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,采用依赖、聚集、组合等关系代替继承。

  1. 子类可以有自己的个性
  2. 覆盖或实现父类的方法时输入参数可以被放大
  3. 覆写或实现父类的方法时输出结果可以被缩小

依赖倒置原则

即面向接口编程。

  1. 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;
  2. 接口或抽象类不依赖于实现类;
  3. 实现类依赖接口或抽象类。

依赖的三种写法

  1. 构造函数传递依赖对象

    1. public interface IDriver {
    2. //是司机就应该会驾驶汽车
    3. public void drive();
    4. }
    5. public class Driver implements IDriver{
    6. private ICar car;
    7. //构造函数注入
    8. public Driver(ICar _car){
    9. this.car = _car;
    10. }
    11. //司机的主要职责就是驾驶汽车
    12. public void drive(){
    13. this.car.run();
    14. }
    15. }
  2. Setter方法传递依赖对象

    1. public interface IDriver {
    2. //车辆型号
    3. public void setCar(ICar car);
    4. //是司机就应该会驾驶汽车
    5. public void drive();
    6. }
    7. public class Driver implements IDriver{
    8. private ICar car;
    9. public void setCar(ICar car){
    10. this.car = car;
    11. }
    12. //司机的主要职责就是驾驶汽车
    13. public void drive(){
    14. this.car.run();
    15. }
    16. }
  3. 接口声明依赖对象(接口注入)

    1. public interface IDriver {
    2. //是司机就应该会驾驶汽车
    3. public void drive(ICar car);
    4. }
    5. public class Driver implements IDriver{
    6. //司机的主要职责就是驾驶汽车
    7. public void drive(ICar car){
    8. car.run();
    9. }
    10. }

接口隔离原则

建立单一接口,不要建立臃肿庞大的接口。再通俗一点讲:接口尽量细化,同时接口中的方法尽量少。

与单一职责原则不同。
单一职责要求的是类和接口职责单一,注重的是职责,这是业务逻辑上的划分。
而接口隔离原则要求接口的方法尽量少。
例如一个接口的职责可能包含10个方法,这10个方法都放在一个接口中,并且提供给多个模块访问,各个模块按照规定的权限来访问,在系统外通过文档约束“不使用的方法不要访问”。
按照单一职责原则是允许的,按照接口隔离原则是不允许的。

因为接口隔离原则要求“尽量使用多个专门的接口”。
专门的接口指什么?就是指提供给每个模块的都应该是单一接口,提供给几个模块就应该有几个接口,而不是建立一个庞大的臃肿的接口,容纳所有的客户端访问。

根据接口隔离原则拆分接口时,首先必须满足单一职责原则。

迪米特法则

一个对象应该对其他对象有最少的了解。
通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。

23种设计模式

门面模式(外观模式)

通过controller层去调用service层,通过service层去调用dao层,就是采用了门面模式。