面向对象的设计原则-类设计原则

转载 2006年06月13日 14:53:00
在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。

 1. 开闭原则(the Open Closed Principle OCP)

  一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。
我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
图1是一个应用OCP生成的收音机类图的例子:

                    图1 OCP应用(收音机)

 2. 替换原则 (the Liskov Substitution Principle LSP)


  子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。


  我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。


  Liskov的相关图示见图2:

              图2 Liskov 原则


  运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B┎⑹迪植僮鰽和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。

 3. 依赖原则 (the Dependency Inversion Principle DIP)


  在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。


  在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。


  面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口(见图-3)。


  为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。

             图3依赖原则图示

 4. 接口分离原则(the Interface Segregation Principle ISP)


  采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。


  ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。


  这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。


  图4展示了一个拥有多个客户的类。它通过一个巨大的接口来服务所有的客户。只要针对客户A的方法发生改变,客户B和客户C就会受到影响。因此可能需要进行重新编译和发布。这是一种不幸的做法。

            图4 带有集成接口的服务类

  我们再看图-5中所展示的技术。每个特定客户所需的方法被置于特定的接口中,这些接口被Service类所继承并实现。

              图5 使用接口分离的服务类设计

  如果针对客户A的方法发生改变,客户B和客户C并不会受到任何影响,也不需要进行再次编译和重新发布。

  以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的耦合度和设计复杂化。

面向对象设计的五项基本原则

面向对象设计(OOD)是面向对象编程(OOP)必不可少的一个环节,只有好的设计,才能保障程序的质量。面向对象设计的主要任务就是类的设计,不少面向对象(OO)的先驱和前辈已经提出了很多关于类的设计原则,...
  • K346K346
  • K346K346
  • 2017年02月13日 22:28
  • 426

面向对象设计原则之开闭原则

开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象设计原则。开闭原则由Bertrand  Meyer于1988年提出,其定义如下: 开闭原则(Open-Closed Princ...
  • bigpudding24
  • bigpudding24
  • 2015年04月27日 13:46
  • 604

面向对象设计的三个基本要素与五种主要设计原则

一、三个基本特征 面向对象的三个基本特征是:封装、继承、多态。 封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。 封装,也就是把客观事...
  • Green_shing
  • Green_shing
  • 2014年03月14日 17:25
  • 2147

面向对象的3个基本要素和5个基本设计原则(整理)

面向对象的3个基本要素:封装、继承、多态  面向对象的5个基本设计原则:  单一职责原则(Single-Resposibility Principle)      其核心思想为:一个...
  • qq_26296197
  • qq_26296197
  • 2017年02月03日 22:30
  • 886

【JAVA】面向对象设计七个原则

程序是为需求服务的,需求无时无刻都有可能变更,最好一开始就依托一套优秀原则来设计程序,以下介绍面向对象设计的七个原则。...
  • u011704894
  • u011704894
  • 2016年01月20日 14:28
  • 1206

设计模式之面向对象七大基本原则

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!概述在运用面向对象的思想进行软件设计时,需要遵循的原则一共有7个,他...
  • yanbober
  • yanbober
  • 2015年04月27日 16:25
  • 5951

面向对象设计的五个基本原则

面向对象的3个基本要素:封装、继承、多态 面向对象的5个基本设计原则: 单一职责原则(Single-Resposibility Principle)     其核心思想为:一个类,最...
  • rankun1
  • rankun1
  • 2016年03月03日 16:32
  • 2524

初识面向对象设计--七大原则概述

面向对象设计有以下几种原则1.开闭原则 Open-Close Principle(OCP) 2.里氏替换原则 Liskov Substitution Principle(LSP) 3.单一职责原则...
  • u011200844
  • u011200844
  • 2015年08月03日 16:06
  • 918

面向对象编程的六个基本原则

运用面向对象的思想进行软件设计时要遵循的6个基本原则: (1)       单一职责原则:一个类只负责一项职责。降低代码复杂度,增加可读性可维护性,只有在逻辑足够简单、类中的方法足够少时才可以在代码级...
  • seek24
  • seek24
  • 2013年10月28日 15:16
  • 1959

面向对象七大设计原则

1:开闭原则(Open for Extension,Closed for Modification)    就是对程序修改关闭,对程序扩展开放。就是在不改变一个程序源码的情况下 改变程序的行为。如何做...
  • chen1280436393
  • chen1280436393
  • 2016年07月09日 15:17
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:面向对象的设计原则-类设计原则
举报原因:
原因补充:

(最多只允许输入30个字)