java设计七大原则

1.单一职责原则

每个应该实现单一的职责,如果职责可拆,则把拆分。(  每个类不应该承担多种职能,当职能可以区分的时候,应该将其分离。)

2.接口隔离原则

如果一个接口中存在子类用不到却必须实现的方法,就要将接口拆分。( 各个类有各个类的专用接口,不要一个接口供所有类去调用)

             2.1接口隔离和单一职责区别:

                   其一,单一职责原则注重的是职责;而接口隔离原则注重对接口依赖的隔离。

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

 

 

3.开闭原则

一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。

4.依赖倒转原则

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

5.里氏替换原则(继承复用

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

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

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

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

    5.4当子类的方法实现父类的抽象方法时,方法的后置条件,即方法的返回值要比父类更严格(小)
 

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

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

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

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

6.合成复用原则:(合成复用

在对象复用时,要尽量先使用组合或者聚合等关联关系来实现,可以理解为里式替换的补充,当继承的子类太多,可以采用组合来降低子类的产生。

 

 

 

7.迪米特原则:对象之间减少直接调用(减少交互),如果有一些类要互相调用,迪米特原则可能调用方式是引入一个中介类去组合或者聚合这些类。优点这些减少这些类的直接调用,缺点中间类会增多。

 

 

 

 

总结:

      1.单一职责(类)和接口隔离(接口),讲究业务和接口结构的细粒度——追求复用。

      2.里氏替换和依赖倒转和合成复用都是为了开闭原则——对扩展开放,对修改关闭 。

      3.迪米特原则,减少类的交互——让类之间的结构更清晰。

 

 

 

你可能感兴趣的:(java)