`
jag522
  • 浏览: 33244 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

设计模式的六大原则

阅读更多

关于设计模式的六大原则,经典的总结是“单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。”

  

  • 单一职责原则(Single Responsibility Principle

一个类只负责一项职责,好处:变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。

 

  • 里氏替换原则(Liskov Substitution Principle

包含了四层意思:

 1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。

 2、子类中可以增加自己特有的方法。

 3、覆盖或实现父类的方法时前置条件更宽松(输入参数可以被放大,即子类的输入类型可以是父类输入类型的超类)

 4、覆盖或实现父类的方法时后置条件更严格(输出结果可以被缩小,即子类返回的类型可以是父类返回类型的子类)

  

  • 依赖倒置原则(Dependece Inversion Principle

 实现父类依赖倒置原则的核心思想是面向接口编程

  

  • 接口隔离原则(Interface Segregation Principle

 

接口隔离原则的含义是:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。

   

说到这里,很多人会觉的接口隔离原则跟之前的单一职责原则很相似,其实不然。其一,单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。其二,单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。

  

采用接口隔离原则对接口进行约束时,要注意以下几点:

 1、接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。

 2、为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

 3、提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

  

  • 迪米特法则(Law of Demeter

 定义:一个对象应该对其他对象保持最少的了解。

 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。

解决方案:尽量降低类与类之间的耦合。

  

  • 开闭原则(Open Close Principle

 原文:“Software entities should be open for extension,but closed for modification”

 翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。

 通俗来说就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。

  

遵循开闭原则设计出的模块具有两个主要特征:

 1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。

 2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。

  

实现开闭原则的关键就在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。我们在软件开发的过程中,一直都是提倡需求导向的。这就要求我们在设计的时候,要非常清楚地了解用户需求,判断需求中包含的可能的变化,从而明确在什么情况下使用开闭原则。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics