《大话设计模式》读书笔记2

时间:2022-12-10 20:14:46

  通过UML图对类与类之间的设计,对软件的代码进行封装,重构,这种方法不仅让代码具有极大的扩展性和优秀的可维护性,同时在我看来,这种整理后的代码更加易于理解,正应了那句话,没有规矩不成方圆,完善的规则带来的是秩序的稳定,这种方法我会逐渐的应用于自己的编程中去。

  因为这学期开设了《软件设计》这门课程,所以通过上课老师的讲解,课后通过做一些练习,对面向对象的设计原则有了一些了解。

   常用的面向对象原则包括7个,这些原则并不是孤立存在的,它们相互依赖相互补充。

  单一职责原则(高内聚,低耦合):单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。就一个类而言,应该仅有一个引起它变化的原因(There should never be more than one reason for a class to change)。一个类承担的责任越多,它被复用的可能性就越小,而且如果一个类承担的职责越多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作。

  开闭原则(基石):开闭原则是面向对象的可复用设计的一块基石,它是最重要的面向对象设计原则。一个软件实体应当对扩展开放,对修改关闭,也就是说在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变这个模块的行为(Software entities should be open for extension, but closed for modification)。这正式我现阶段遇到的最大问题,只要一修改代码,就要对整个代码做出调整,浪费时间不说,收获却并没有多少。

  里式代换原则:开闭原则的核心是对系统进行抽象化,并且从抽象化导出具体化。从抽象化到具体化的过程中需要使用继承关系及里氏代换原则。定义:所有引用基类(父类)的地方必须能够透明地使用其子类的对象(Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it)。

  依赖倒转原则(面向对象设计的主要手段):如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是实现面向对象设计的主要机制,依赖倒转原则是系统抽象化的具体实现。定义:要针对接口编程,不要针对实现编程(Program to an interface , not an implementation)。简单的说,代码要依赖于抽象的类,而不要依赖于具体的类,要针对接口或抽象类编程,而不是针对具体类编程。

  接口隔离原则:接口隔离原则要求我们将一些较大的接口进行细化,使用多个专门的接口来替换单一的总结口。定义:一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需要知道与之相关的方法即可(Once an interface has gotten too ’fat’ it need to be split into smaller and more specific interfaces so that any clients of the interface will only know about the methods that pertain to them)。

  合成复用原则:合成复用原则是面向对象设计中非常重要的一条原则,为了降低系统中类之间的耦合度,该原则倡导多用关联关系,少用继承关系。定义:尽量使用对象组合,而不是继承来达到复用的目的(Favor composition of objects over inheritance as a reuse mechanism)。通过继承来实现复用很简单,而且子类可以覆盖父类的方法,易于扩展。但其主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的某些内部细节对子类来说也是可见的,所以这种复用又称为“白箱”复用。如果基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性,而且继承只能在有效的环境中使用(例如类不能被声明为final类)。

  迪米特法则:迪米特法则用于降低系统的耦合度,使类与类之间保持松散的耦合关系。迪米特法则又称为最少知识原则。定义:(1).不要和“陌生人”说话(Don’t talk to stangers)。(2).只与你的直接朋友通信(Talk only to your immediate friends)。(3).每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位(Each unit should have only limited knowledge about other units: only units ‘closely’ related to the current unit)。