设计模式-代码设计原则

设计模式的原则
为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性(即应付变化)。
 
  • 面向对象的原则。
那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principle,OCP)、里氏代换原则(Liskov Substitution Principle,LSP)、依赖倒转原则(Dependency Inversion Principle,DIP)、接口隔离原则(Interface Segregation Principle,ISP)、合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)、最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)。开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。
设计模式的代码设计原则,就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。
1,开闭原则。开放扩展,扩展用子类或抽象类接口在实现类。关闭修改。
比如为了提高内存,不改原内存,加内存条

开闭原则具有理想主义的色彩,它是面向对象设计的终极目标其他几条,则可以看做是开闭原则的实现方法。 设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。

扩展时用抽象类或接口定义扩展的范围,引用对象也用抽象类和接口,抽象层尽量保持稳定

完全开闭不可能,做到当发生变化时,尽量隔离变化的部分,为将来的同类变化做准备即可。

2,里氏代换原则。即为了实现开闭,使用继承。如果调用的是父类的话,那么换成子类也完全可以运行。
比如设计继承时,企鹅类不能继承于鸟类,因企鹅类不能飞,因而不能替换鸟类,所以不能设计成继承关系。这样,在扩展时,父类不用修改,新加子类即可,而父类的功能,子类来继承,并替换父类使用(不是new改写),这样就实现了开闭原则,同时因为依赖倒转原则,大家灵活自如,就轻松实现子类替换父类。
3,依赖倒转原则。   
简单的说就是要求对抽象类或接口进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
比如,就是电脑配件之间的接口是不变的,不同的cpu,都是针脚或触电接口,cpu变,接口不变,不影响与其他配件的以前使用;同时,作为高层的主板,也应该提供不变的接口,这样换主板时,就不用换其他配件了;再比如收音机,零件焊在一起,不懂的人根本没法修,耦合过度。
当有扩展时,只要新加实现抽象类或接口的实现类即可,不用改以前的代码,增加以前代码的复杂度或把以前的代码改出问题。
4,接口隔离原则/单一职责原则。
使用尽量小到实现单一功能的接口,以便实现接口的类不必实现太多功能,另外提高了灵活性
比如电脑哪儿坏了修哪儿,每个零件都有单独的职责
接口不要臃肿,小到实现单一职责就好,同时一个接口提供的方法尽量少,但不能太灵活,太灵活就提高了复杂度。接口尽量高内聚。定制服务。
5,组合(部分不可独立)/聚合(部分可独立)复用原则(Composite/Aggregate Reuse Principle CARP).
组合和聚合都是对象建模中关联(Association)关系的一种。聚合表示整体与部分的关系,表示“含有has a”,整体由部分组合而成,部分可以脱离整体作为一个独立的个体存在。组合则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在,在合成关系中,部分和整体的生命周期一样,组合的新的对象完全支配其组成部分,包括他们的创建和销毁,一个合成关系中成分对象是不能与另外一个合成关系共享。
      组合/聚合和继承是实现复用的两个基本途径。合成复用原则是指尽量使用组合/聚合,而不是使用继承。
       只有当以下的条件全部被满足时,才应当使用继承关系。
         子类是原类的一个特殊种类,也就是区分“Has-A”和“Is-A”.只有“Is-A”关系才符合继承关系,“Has-A”关系应当使用聚合来描述。
        子类只属于这个父类,不会出现子类还属于其他父类。即符合子类只能继承自一个父类
         子类是扩展父类,而不是替换掉父类。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。
6,最少知识原则
也叫迪米特法则。不要和陌生人说话,即一个对象应对其他对象有尽可能少的了解。
 
总结
· 组合优于继承:说的是尽量组合,这比继承好。
· 傻瓜原则:说的是你的类知道的东西越少越好。 
· 闭包原则:说的是把相关的类打包到一起。 
· 稳定抽象原则:说的是想少改动一个类的话,就尽量用抽象的东西定义它。
原文地址:https://www.cnblogs.com/yinlg/p/4904626.html