设计模式6原则1法则

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

设计模式6大原则

六原则一法则

s( Single-Resposibility Principle ) : 单一职责原则。
o( Open-Closed principle )          : 开放封闭原则。
l( Liskov-Substituion Principle )   : 里氏替换原则。
d( Dependecy-Inversion Principle )  : 依赖倒置原则。
i( Interface-Segregation Principle ): 接口隔离原则。
                                      合成/聚合复用。
                                      迪米特法则(最少知道)

(1)单一职责

一个类的功能要单一, 一个类只负责一个职责。 一个类只做它该做的事情(高内聚)

  如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受意想不到的的破坏

 作用

  如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则

(2)开放-封闭

  软件实体(类、模块、函数等) 对修改关闭。 对扩展开放

  • 有新的需求或变化时, 可以对现有代码进行扩展, 以适应新的情况。
  • 对修改封闭, 意味着类一旦设计完成, 就可以独立其工作, 而不要对类尽任何修改。
    • 在开发阶段, 我们都知道, 如果对一个功能进行扩展, 如果只是一味地对方法进行修改, 可能会造成一些问题, 诸如可能会引入新的 bug,
    • 或者增加代码的复杂度, 对代码结构造成破坏、 冗余, 还需要重新进行全面的测试。 那么该怎么解决这些问题? 很简单,这就需要系统能 够支持扩展, 只有扩展性良好的系统, 才能在不进行修改已有实现代码的基础上, 引进新的功能。

 作用

     可维护性,可扩展性,可复用,灵活性好

(3)里氏替换

   任何使用基类的地方, 都能够使用子类替换, 而且在替换子类后, 系统能够正常工作。

  • 子类一定是增加父类的能力而不是减少父类的能力, 因为子类比父类的能力更多, 把能力多的对象当成能力少的对象来用当然没有任何问题。
  • 一个软件实体如果使用的是一个基类, 那么当把这个基类替换成继承该基类的子类, 程序的行为不会发生任何变化。软件实体察觉不出基类对象和子类对象的区别。

 作用

  1. 提高代码的重用性,子类拥有父类的方法和属性;
  2. 提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性;

 不足

   1. 继承是侵入性的,只要继承就必须拥有父类的所有方法和属性,在一定程度上约束了子类,降低了代码的灵活性;
   2. 增加了耦合,当父类的常量、变量或者方法被修改了,需要考虑子类的修改,所以一旦父类有了变动,很可能会造成非常糟糕的结果,要重构大量的代码。

(4)接口隔离

   使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。

  • 将接口粒度最小化,将功能划分到每一个不能再分的子角色, 为每一个子角色创建接口通过这样,才不会让接口的实现类实现一些不必要的功能。
  • 建立单一的接口, 不要建立臃肿的庞大的接口, 也就是说接口的方法尽量少。接口要小而专, 绝不能大而全。 臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力, 接口也应该是高度内聚的。

  作用

   实现模块间的松耦合

(5)依赖倒置

   我们的类要依赖于抽象, 而不是依赖于具体, 也就是我们经常听到的“要面向接口编程” 。

  • 该原则说得具体一些就是声明方法的参数类型、 方法的返回类型、 变量的引用类型时, '尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代
    (1)高层模块不应该依赖低层模块,两个都应该依赖抽象
    (2)抽象不应该依赖细节,细节应该依赖抽象

 作用

   通过抽象(抽象类或接口) 使各个类或模块的实现彼此独立, 不相互影响, 实现模块间的松耦合。 减少类间的耦合性。

(6)合成/聚合复用

将已有对象纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能。

  • 在面向对象设计中,如果直接继承基类,会破坏封装,因为继承将基类的实现细节暴露给子类;如果基类的实现发生改变,则子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性。
  • 于是就提出了合成/聚合复用原则,也就是在实际开发设计中,尽量使用合成/聚合,不要使用类继承.一般而言,如果一个角色得到了更多的责任,那么可以使用合成/聚合关系将新的责任委派到合适的对象。当然,这种复用也有缺点。
  • 最主要的缺点就是通过这种复用建造的系统会有较多的对象需要管理。

迪米特法则(最少知道法则)

   如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类要调用另一个类的某种方法,可以通过第三方转发这个调用

  • 在类的结构设计上,每个类都应当尽量降低成员的访问权限

 作用

   类间解耦,降低耦合度,只有弱耦合之后,类的复用性才可以提高

猜你喜欢

转载自blog.csdn.net/qq_17556191/article/details/94995868