`

[转]面向对象设计模式的核心法则

 
阅读更多

[转]http://www.toplee.com/blog/1249.html

 

 

有本经典的书叫《设计模式》,讲了经典的21种设计模式,建议大家都看看。
1. 单一职责
就一个类而言,应该仅有一个引起它变化的原因。
如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。
软件设计真正要做的许多内容,就是发现职责并把那些职责互相分离。如果你多于一个动机去改变一个类,那么这个类就具有多于一个的职责。
2. 开放封闭
软件实体(类,模块,函数等)应该可以扩展,但是不可修改。也就是说,对于扩展是开放的,对于更改是封闭的。
如此设计,面对需求的改变可以保持相对的稳定,从而使系统可以在第一个版本以后不断的推出新的版本。
无论模块是多么的’封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。
等到变化发生时立即采取行动。
在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象来隔离以后发生的同类变化。
面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。
我们希望的是在开发工作展开不久就知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。
开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都可以的进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
3. 依赖倒转
高层模块不应该依赖底层模块。两个都应该依赖抽象。
抽象不应该依赖细节,细节应该依赖抽象。
抽象不应该依赖细节,细节应该依赖于抽象,针对接口编程,不要对实现编程。
依赖倒转其实可以说是面向对象设计的标志,用哪种语言来写程序并不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程, 即程序中所有的依赖关系都终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。
4. 里氏代换
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且察觉不出父类对象与子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。
子类型必须能用替换掉它们的父类型。
只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
5. 合成/聚合复用
尽量使用合成/聚合,尽量不要使用类继承。
优先使用对象的合成/聚合将有助于你保持每个类被封装并被集中在单个任务上,这样累和类继承层次会保持较小的规模,并且不大可能增长为不可控制的庞然大物。
6. 迪米特法则
如果两个类不必彼此直接通信,那么着两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
在类的结构设计上,每一个类都应当尽量降低成员的访问权限,也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开。
迪米特法则其根本思想是强调了类之间的松耦合。
类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
辅助资料:
常用创建型设计模式(其他类型模式就不提了,自己看书)
创建型模式隐藏了这些类的实例是如何被创建和放在一起,整个系统关于这些对象所知道的是由抽象类所定义的接口。这样,创建型模式在创建了什么、谁创建它=它是怎么被创建的,以及何时创建这些方面提供了很大的灵活性。
1. 工厂方法模式(Factory Method)
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类。
创建型模式抽象了实例化的过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。创建型模式都会将关于该系统使用哪些具体的类的信息封装起来。允许客户用结构和功能差别个很大的’产品’对象配置一个系统。配置可以是静态的,即在编译时制定,也可以是动态的,就是运行时再指定。
通常设计应该是从工厂方法开始,当设计者发现需要更大的灵活性时,设计便会向其他创建型模式演化。当设计者在设计标准之间进行权衡的时候,了解多个创建型模式可以给设计者更多的选择余地。
2. 抽象工厂模式(Abstract Factory)
提供一个创建一系列或者相关依赖对象的接口,而无需指定它们具体的类。
3. 建造者模式(Builder)
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
内聚性与耦合性 内聚性描述的是一个例程内部组成部分之间相互联系的紧密程度。而耦合性描述的是一个例程与其他例程之间联系的紧密程度。软件开发的目标应该是创建这样的例程:内部完整,也就是高内聚,而与其他例程之间的联系则是小巧、直接、可见、灵活的,这样就是松耦合。
将一个复杂对象的构建与它的表示分离,这就可以很容易地改变一个产品的内部表示,并且使得构造代码和表示代码分开。这样对于客户来说,它无需关心产品的创建过程,而只要告诉我需要什么,我就能用同样的构建过程创建不同的产品给客户。
4. 原型模式(Prototype)
用原型的实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。
建立相依数目的原型并克隆它们通常比每次用合适的状态手工实例化该类更方便一些。
5. 单例模式(Singleton)
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
对一些类来说,一个实例是很重要的。一个全局变量可以使得一个对象被访问,但它不能防止客户实例化多个对象。单例的优势就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且单例还提供了一个访问该实例的方法。这样就使得对唯一的实例可以严格地控制客户怎样以及何时访问它。
<!--EndFragment-->
分享到:
评论

相关推荐

    面向对象设计模式与原则

    要想真正理解和应用面向对象设计模式,还需要深入了解面向对象的核心概念和原则。 #### 面向对象设计模式的应用示例 为了更好地理解面向对象设计模式的应用,我们可以参考一个人事管理系统中的员工工资计算案例。...

    面向对象设计原则和设计模式的概念

    面向对象设计原则与设计模式是软件工程领域的重要组成部分,它们为构建高质量、可维护和可扩展的软件系统提供了指导方针。下面将详细阐述面向对象设计原则及其如何促进软件的复用,以及设计模式的概念。 ### 面向...

    面向对象与设计模式基础笔记

    下面介绍面向对象设计的七大基本原则: 1. **LSP (Liskov Substitution Principle, 替换原则)** - 描述:父类出现的地方,子类都可以替换。 - 解释:子类应该能够替换其基类,并且程序的行为不会改变。这意味着...

    设计模式 面向对象程序设计 C#版

    整本书通过生动的例子和幽默的语言,让读者在轻松的氛围中掌握面向对象设计模式的精髓。面向对象思想的胜利,就如同活字印刷术的发明,改变了软件开发的格局,使得程序员能够更高效地应对需求变化,提高了软件产品的...

    面向对象的Java设计模式

    2. **面向对象设计原则** - **单一职责原则(SRP)**:一个类应该只负责一项功能。 - **开放封闭原则(OCP)**:对扩展开放,对修改封闭。即软件实体应易于扩展而难以修改。 - **里氏替换原则(LSP)**:子类必须...

    面向对象设计模式的核心法则

    面向对象设计模式是软件开发中的一种重要思想,它旨在提高代码的可维护性、可扩展性和可重用性。核心法则包括以下六项: 1. 单一职责原则(Single Responsibility Principle, SRP):一个类应只有一个引起其变化的...

    戏说面向对象程序设计(C#版).pdf

    #### 三、面向对象设计的关键原则 **面向对象设计的原则**: - **封装**:将数据和操作数据的方法绑定在一起,隐藏内部实现细节,只暴露对外接口。 - **继承**:允许创建一个类(子类)继承另一个类(父类)的属性...

    面向对象分析与设计试卷

    6. **面向对象设计**:这涵盖了类和对象的设计、接口设计、架构设计等,可能涉及如何通过设计模式优化系统结构,以及如何实现模块间的有效通信。 7. **软件生命周期**:面向对象分析与设计贯穿于整个软件开发过程,...

    面向对象设计原则源码及文档

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心。在设计面向对象的程序的时,模式不是一定要套的,但是有一些原则最好是遵守。这些原则已知的有七个,包括:单一...

    深入浅出面向对象分析与设计.pdf

    接着,在面向对象设计阶段,我们可以进一步细化这些对象之间的关系,比如用户和书籍之间可能存在借阅关系,管理员则负责管理用户和书籍。 通过这样的分析与设计过程,不仅能够帮助我们更好地理解系统的需求,还能...

    设计模式-可复用面向对象软件的基础

    面向对象设计原则是面向对象设计的核心思想,它包括但不限于单一职责原则、开放封闭原则、里氏替换原则、迪米特法则等。这些原则与设计模式密切相关,设计模式实际上是遵循这些原则的具体实践之一。例如: - **单一...

    面向对象设计与分析和UML教程

    5. **面向对象设计模式**:设计模式是解决常见问题的最佳实践,如工厂模式、单例模式、观察者模式、装饰器模式等。它们为复杂问题提供了结构化的解决方案,提高了代码的复用性和可读性。 6. **UML在OOD&A中的应用**...

    数据结构与算法 面向对象的C++设计模式 源代码

    这些文件名似乎来自于一个关于数据结构、算法以及面向对象C++设计模式的代码库,包含了一些特定的程序示例。让我们深入探讨一下这些主题及其重要性。 数据结构是计算机科学中的核心概念,它涉及到如何组织和存储...

    Java设计模式02面向对象设计原则

    ### 面向对象设计原则概览 面向对象设计原则是指导软件工程师在设计阶段遵循的一系列准则,旨在提高软件的可维护性、可复用性和可扩展性。这些原则由多位软件设计大师总结提炼而成,如Robert C. Martin和Peter Coad...

    面向对象程序设计之C#版Grady Booch.pdf

    本书不仅覆盖了面向对象的基本原理,还深入探讨了高级设计模式和技术,对于初学者乃至有经验的开发者来说都是不可多得的资源。 #### 重点章节解读 **代序:四大发明之活字印刷——面向对象思想的胜利** - **面向...

    面向对象设计原则.pdf

    本文将深入探讨“面向对象设计原则.pdf”文档中提及的关键知识点,包括面向对象设计的基本法则,以及组合与继承这两种重要的设计模式。 ### 组合优先于继承 文档中的第一条法则强调了“优先使用组合,而非继承”。...

Global site tag (gtag.js) - Google Analytics