java设计六大原则

1.1.单一职责原则(总)

每个类应该实现单一的职责,不过职责可拆,则把类拆分。

1.开闭原则

一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。(不去改接口,不去改实体类,用子类去继承实体类,重载实体类的方法得到业务的扩展)


2.里氏替换原则

子类可以扩展父类的功能,但是不能改变父类原有的功能。

    2.1子类可以实现父类的抽象方法,但是不能重写父类的非抽象方法。

    2.2子类可以增加自己特有的方法。

    2.3当子类的方法重载父类的方法时,方法的前置条件,即方法的形参要比父类方法参数更宽松(大)

扫描二维码关注公众号,回复: 1029386 查看本文章

    2.4当子类的方法实现父类的抽象方法时,方法的后置条件,即方法的返回值要比父类更严格(小)
作者:aaron hao
链接:https://www.zhihu.com/question/27191817/answer/145013324
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

LSP的原定义比较复杂,我们一般对里氏替换原则 LSP的解释为:子类对象能够替换父类对象,而程序逻辑不变。

里氏替换原则有至少以下两种含义:

1. 里氏替换原则是针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,不能被子类重新定义
。子类只能通过新添加方法来扩展功能,父类和子类都可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑和父类一致的方法,这时用子类对象将父类对象替换掉时,当然逻辑一致,相安无事。


2. 如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合LSP,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类就是不能实例化,所以也不存在可实例化的父类对象在程序里。也就不存在子类替换父类实例时逻辑不一致的可能。

不符合LSP的最常见的情况是,父类和子类都是可实例化的非抽象类,且父类的方法被子类重新定义,这一类的实现继承会造成父类和子类间的强耦合,也就是实际上并不相关的属性和方法牵强附会在一起,不利于程序扩展和维护。

如何符合LSP?总结一句话 —— 就是尽量不要从可实例化的父类中继承,而是要使用基于抽象类和接口的继承。


3.依赖倒转原则

面向接口编程,依赖于抽象而不依赖于具体。写代码用到具体类时,不与具体类交互,而与具体类的上层接口交互。

4.接口隔离原则

如果一个接口中存在子类用不到却必须实现的方法,就要将接口拆分。使用多个隔离的接口,比使用单个接口要好。

接口隔离和单一职责区别:其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
采用接口隔离原则对接口进行约束时,要注意以下几点:
1. 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
2. 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
3. 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

5.迪米特法则

一个类对自己依赖的类知道的越少越好,也就是说对于被依赖的类来说,无论逻辑多么复杂,都尽量的将逻辑封装在类内部,对外提供public方法,不对外泄露任何信息。

6.合成复用原则

原则是尽量首先使用合成/聚合的方式,而不是使用继承。


猜你喜欢

转载自blog.csdn.net/weixin_36552034/article/details/79354553
今日推荐