带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

  • 前言

  • 1. 设计原则

    • 1.1. 开-闭原则

    • 1.2. 里氏代换原则

    • 1.3. 依赖倒转原则

    • 1.4. 接口隔离原则

    • 1.5. 合成/聚合原则

    • 1.6. 迪米特法则

       

前言

学习设计模式之前先要了解其中的设计原则,因为一个系统的设计需要遵守一定的原则,通过这些原则实现具体的设计模式。

 

设计原则有以下几种:

  • 开-闭原则

  • 里氏代换原则

  • 依赖倒转原则

  • 接口隔离原则

  • 合成/聚合复用原则

  • 迪米特法则

1. 设计原则

1.1.  开-闭原则

 

开闭原则指一个软件实体应当对扩展开发,对修改关闭。因此在设计一个模块时,应当使这个模块可以在不被修改的前提下被扩展。

 

满足开闭原则的设计可以提高系统的优越性:通过扩展已有的软件系统可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的使用性和灵活性;已有的软件模块特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统具有一定的稳定性和延续性。

 

如何实现开闭原则:

 

  • 首先就是抽象化,在Java中可以给出一个或者多个抽象类或者接口,规定所有的类必须提供特征作为类的抽象层。也就是我们平时实现的接口或者抽象类,在接口或者抽象类中实现可能的方法,在需要扩展时不需要改变接口或者抽象类,只需要实现接口或者继承抽象类,并且重写其中的方法即可,这样就做到对扩展关闭对修改开放。

 

  • 第二个方面就是封装:封装指的是对可变性的封装,可以理解为找到一个系统的可变因素将之封装起来。在Java中继承就是一种封装,对于继承我们会将一些会通用的因素封装成一个对象,而需要用到时只要继承该对象即可。因此继承应当被看做是封装变化的方法,而不应当被认为是从一般的对象生成特殊的对象的方法。同时泛型也可以理解为一种封装,在使用泛型时会不固定类型,那么这样就可以通过泛型的封装得到泛型类,从而实现想要的类型。

 

  • 以上的抽象化以及封装都是对开闭原则的一种体现,这种方法保证了开闭原则中对扩展关闭对修改开放的原则。

 

 

 

 

1.2.  里氏代换原则

 

里氏代换原则可以解释为任何基类可以出现的地方,子类一定可以出现。对于这句话的理解可以结合开闭原则中的继承来理解,在Java中继承保证了基类与子类的关系,所以继承就是抽象化的具体体现。因此可以把里氏代换原则理解为对开闭原则中抽象化的具体实现。

 

因此要是违反了里氏代换原则那么就一定违反了开闭原则。

 

1.3.  依赖倒转原则

 

依赖倒转原则解释为要依赖于抽象而不是依赖于实现。这句话的理解可以结合Java中抽象类或者接口,当一个类实现了某个接口或者继承了某个抽象类时,那么这个类就是实现类,而我们依赖的就是实现类的上一层的抽象类或者接口,如果有其它类需要重新实现方法时,不能依赖实现类,而是要依赖抽象类。

 

例如有一个接口A,B类实现了接口A并重写了其中的方法,此时有一个C类,那么C类需要实现接口A,而不能继承B类,如果继承B类,那么就违反了依赖倒转原则。因为如果继承B类,那么就违反了开闭原则。

 

 

 

1.4.  接口隔离原则

 

该原则可以从字面进行理解,就是对接口的隔离,这个原则主要是为客户端提供尽可能小的单独的接口,而不要提供大的总接口。

 

比如平时开发时需要对外暴露接口时需要对接口进行一定的隔离策略,只暴露对外需要的接口,而将一些不需要暴露的接口进行隔离。因此对于接口隔离原则的理解是对系统通信的限制,这种原则限制系统对外通信尽可能的窄,防止对外暴露过多的通信。这样就保证了系统在功能扩展过程中不会将修改的压力传递到其它的对象。

 

 

1.5.  合成/聚合原则

 

合成/聚合复用原则的目的就是要求尽量使用合成/聚合,而不是继承关系达到复用的目的。合成/聚合就是UML中的两种关系,合成是一种最强的关联关系,并且合成类中可以对附属的类进行控制,也就是在合成关系中需要分清整体类与个体类,而聚合则是次一级的关联关系,聚合关系中都是个体类,个体类聚合可以组成一个整体。

 

因此合成/聚合复用原则与里氏代换原则是相辅相成的,两者都是对开闭原则具体步骤的规范。合成/聚合原则要求设计师在设计时首先考虑合成/聚合关系,而里氏代换原则要求在使用继承关系时,必须确定这个关系是符合一定条件的。这里可以理解为有关联的才需要使用继承,不能随便以及盲目的继承。

 

 

1.6.  迪米特法则

 

迪米特法则的理解为一个软件实体应当尽可能少的与其它实体发生相互作用。对于这个可以理解为平时在使用一些类时尽可能的不要跟其它类进行相关联,而每个实体类尽量相互独立,这样在后续的功能扩展时如果要修改该类,那么对其它模块也不会产生影响。

 

 

如果一个类关联了多个类,那么该类修改可能就会导致影响其它功能模块,造成整个系统的不稳定性。同时保证了系统在功能扩展时能够容易的做到对修改的关闭。

 

 

 


 


参考资料:

 

1、《Java与模式》

 

 

 

 

你可能感兴趣的:(设计模式,设计模式,设计原则)