1. ISP (Interface Segregation Principle) -- 一个接口中的所有契约应该是所有这一类东西所具有的, such as, Door 具有 open(), close(). 但是对于alarm() , 一般的门是没有的。
public interface Door {
public void open();
public void close();
}
for function alarm(); we should define a interface.
public interface Alarmer {
public void alarm();
}
If you want to have a door with basic fuction and alarm funciton
public class AlarmDoor implements Door, Alarmer {
}
For better, we should use following design.
abstract class Door{
abstract void open();
abstract void close();
}
interface Alarm{
void alarm();
}
class Alarm Door extends Door implements Alarm{
void open(){…}
void close(){…}
void alarm(){…}
}
在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于指导OO的设计和开发。下面是几条与类设计相关的设计原则。
1. 开闭原则(the Open Closed Principle OCP)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是软件工程设计方法的重要原则之一。我们以收音机的例子为例,讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源,对准电台频率和进行音量调节。但是对于不同的收音机,实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此,我们不太可能针对每种不同类型的收音机通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口,提供开机、关机、增加频率、降低频率、增加音量、降低音量六个抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型,收音机类型扩展极为方便。此外,已存在的收音机类型在修改其操作方法时也不会影响到其它类型的收音机。
2. 替换原则 (the Liskov Substitution Principle LSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。
我们以学生为例,夜校生为学生的子类,因此在任何学生可以出现的地方,夜校生均可出现。这个例子有些牵强,一个能够反映这个原则的例子时圆和椭圆,圆是椭圆的一个特殊子类。因此任何出现椭圆的地方,圆均可以出现。但反过来就可能行不通。
运用替换原则时,我们尽量把类B设计为抽象类或者接口,让C类继承类B(接口B)并实现操作A和操作B,运行时,类C实例替换B,这样我们即可进行新类的扩展(继承类B或接口B),同时无须对类A进行修改。
3. 依赖原则 (the Dependency Inversion Principle DIP)
在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。
在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然这是结构化方法的一个"硬伤"。
面向对象方法的依赖关系刚好相反,具体实现类依赖于抽象类和接口。
为此,我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类(子类)来实现该业务方法,业务方法内容的修改将不会影响到运行时业务方法的调用。
4. 接口分离原则(the Interface Segregation Principle ISP)
采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。
ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP,组件、类的可用性和移植性将大打折扣。
这个原则的本质相当简单。如果你拥有一个针对多个客户的类,为每一个客户创建特定业务接口,然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。
以上四个原则是面向对象中常常用到的原则。此外,除上述四原则外,还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来,我们看到这些类在几何分布上呈现树型拓扑的关系,这是一种良好、开放式的线性关系、具有较低的设计复杂度。一般说来,在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系,它们反映的是较大的耦合度和设计复杂化。
segregation [,seɡri'ɡeiʃən]
详细»
n. 隔离,分离;种族隔
发表评论
-
Classloader
2011-11-22 14:09 774The class loader: BootStrap c ... -
JUnit Knowledges
2011-10-25 23:09 771mock objects: http://bigwhite. ... -
Java跨平台程序设计规则
2011-09-20 12:38 964不是说所有的Java程序都具有Java跨平台的特性,事实上,相 ... -
Servlet - life cycle and listener events
2011-08-25 15:56 855import database.BookDBAO; ... -
Common Gateway Interface
2011-08-25 15:20 1402A web server that supports ... -
什么时候使用属性或者元素(Designing XML document)
2011-08-19 11:34 1017Properties 是平面结构,想要表达结构复杂的信息有一定 ... -
Java - Generic
2011-07-19 12:35 732Generics <!--[if !suppor ... -
Java Exception Study
2011-07-13 16:37 863Java Exception <!--[if ! ... -
Framework comparision
2011-07-13 09:28 967Others Java Framework Quartz ... -
面向对象的原则 12
2011-07-11 15:38 838依赖管理是我们每 ... -
Java 构造函数(抽象类中的构造函数) 和 加载
2011-07-11 15:25 92171. Java 的构造函数 ... -
Java 接口与抽象类 (interface V abstract)
2011-07-11 14:24 1057详细解析Java中抽象类和接口的区别 在Jav ... -
Design Pattern
2011-07-11 11:52 664Mediator 一、引子 中介在现实 生活中并 ... -
Java Generic, Association, Composition, Aggregate
2011-07-05 16:20 1163UML中依赖泛化关联实现聚合组合的Java实现 ... -
ETL
2011-06-30 11:36 863ETL 对于数据仓库以及ETL的知识,我基本上是个 ... -
Java Collection Frameworks 学习
2011-06-30 11:17 703Java 集合总结 <!--[if !su ... -
Java Clone
2011-06-29 16:07 819Clone interface: 如果一个实现了Cl ... -
Credit Card 的工具类
2010-05-10 15:24 888这是一个非常有用的工具类用于验证credit card, 是a ... -
实例化抽象类时实现抽象类里的抽象方法
2010-04-16 09:18 1018EccTrxCmd logWSCall = new EccTr ... -
Java reflect
2010-03-09 16:21 826【转】Java反射经典实例 Java Reflection C ...
相关推荐
### 面向对象设计原则详解 面向对象设计(Object-Oriented Design,简称OOD)是一种软件设计方法,它强调将复杂系统分解为简单的、相互协作的对象。在面向对象编程中,遵循一定的设计原则是非常重要的,这些原则有...
面向对象设计原则总结 面向对象设计原则是软件设计中最重要的原则之一,它们是软件设计的基础和核心。面向对象设计原则的应用可以提高软件的开发效率、质量和可维护性。下面是七大面向对象设计原则的总结: 一、开...
首先,我们来了解四个基础的面向对象设计原则:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)和接口隔离原则(ISP)。 1. 单一职责原则(Single Responsibility Principle, SRP):一个类或模块...
面向对象设计原则与UML简介 ...在这个例子中,`B`类继承自`A`,实现了代码复用和功能扩展,符合面向对象设计原则。通过UML和面向对象设计原则的结合使用,开发者能够构建出更高效、更具扩展性的软件系统。
本文将详细介绍以下四个主要的面向对象设计原则: 1. 开放封闭原则(OCP):这个原则由贝里·伯特兰提出,它主张软件实体(如类、模块、函数等)应该是对扩展开放的,但是对修改封闭的。也就是说,在不改变现有代码...
总之,面向对象设计UML实践课程的目标是让学生掌握如何运用UML工具进行有效的软件设计,理解面向对象设计的核心原则,并能够熟练地在实际项目中应用设计模式。通过学习和解答英文版的练习,不仅能够提升技术能力,还...
它通过系统地介绍面向对象设计的基础知识、符号表示、发展历史、原理、优点和缺点,为读者提供了一个全面的、可操作的学习框架。无论是初学者还是经验丰富的开发者,都能从中获得知识和技能的提升。该书不仅帮助...
面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它基于“对象”的概念,通过封装、继承和多态等机制来组织代码。在OOP中,有四个基本原则,它们是设计高质量、可维护软件的基石。这四...
### 面向对象设计模式与原则 #### 设计模式的概念与起源 设计模式是一种用于描述在特定场景下解决问题的方法论。它不仅提供了一种通用的解决方案,还为软件开发者们提供了一种共享语言,使得他们能够更有效地交流...
### 面向对象设计模式与原则 #### 设计模式简介 设计模式是软件工程领域的一个重要概念,它提供了一套解决特定问题的通用方案。正如克里斯托弗·亚历山大(Christopher Alexander)所言:“每一个模式描述了一个在...
《设计模式:可复用面向对象软件的基础》一书中,四位作者(被称为Gang of Four,即GoF)总结了23种经典的面向对象设计模式。这些模式被广泛地应用于软件开发中,成为了设计模式领域的经典之作。这些模式按照目的和...
除了以上四个原则,还有其他设计原则如单一职责原则(Single Responsibility Principle, SRP)、迪米特法则(Law of Demeter, LoD)等。遵循这些原则有助于创建可维护、可扩展且易于理解的代码,从而提升整个系统的...
面向对象设计的原则主要有四个:单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)和依赖倒置原则(Dependency...
在面向对象设计中,抽象表现为类的定义,一个类可以代表一类具有相同属性和行为的对象。 2. **封装**:是指隐藏对象的实现细节,只暴露必要的接口供外部调用。这有助于保护数据的完整性和安全性,同时使得修改内部...
《Ruby面向对象设计实践》不仅讲解了面向对象编程的基本概念和技术,还深入探讨了如何应用设计原则和设计模式来编写更高质量的代码。 ##### 1. SOLID原则 - **单一职责原则**(Single Responsibility Principle, ...
面向对象程序设计有四个基本特性:封装性、继承性、多态性和抽象性。 (1)封装性:指把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 (2)继承性:...
3. **编码实现**:按照设计文档编写代码,注意遵循面向对象设计的原则,如单一职责原则、开放封闭原则等。 4. **测试与维护**:完成编码后进行测试,确保系统满足需求。在后期维护过程中,也要遵循面向对象设计的...
另一方面,"经典java项目源代码.rar"包含了一些实际的Java项目源码,这些源码可以用来学习和理解如何在实际开发中应用面向对象设计原则。通过阅读和分析这些代码,我们可以看到面向对象设计在真实世界中的应用,包括...