`

面向对象编程,真离不开设计模式?

阅读更多
  设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
  毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
  GoF(“四人帮”,指Gamma, Helm, Johnson & Vlissides, Addison-Wesley四人)的《设计模式》(1995年出版)是第一次将设计模式提升到理论高度,并将之规范化,本书提出了23种基本设计模式,自此,在可复用面向对象软件的发展过程中,新的大量的设计模式不断出现。

设计模式和框架

  现在,可复用面向对象软件系统现在一般划分为三大类:应用程序工具箱和框架(Framework),我们平时开发的具体软件都是应用程序;Java的API属于工具箱;而框架是构成一类特定软件可复用设计的一组相互协作的类。EJB(EnterpriseJavaBeans)是Java应用于企业计算的框架.
  框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节。框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架设计中必然要使用设计模式.
  另外,设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式,毫无疑问,你将迅速掌握框架的结构,我们一般开发者如果突然接触EJBJ2EE等框架,会觉得特别难学,难掌握,那么转而先掌握设计模式,无疑是给了你剖析EJB或J2EE系统的一把利器。

设计模式的原则

  近年来,大家都开始注意设计模式。那么,到底我们为什么要用设计模式呢?这么多设计模式为什么要这么设计呢?说实话,以前我还真没搞清楚。就是看大家一口一个"Design pattern",心就有点发虚。于是就买了本"四人帮"的设计模式,结果看得似懂非懂:看得时候好像是懂了,过一会就忘了。可能是本人比较"愚钝"吧:))最近,有了点感悟。"独乐不如众乐",与大家分享一下,还望指教!
  为什么要提倡"Design Pattern"呢?根本原因是为了代码复用,增加可维护性。那么怎么才能实现代码复用呢?OO界有前辈的几个原则:"开-闭"原则(Open Closed Principal)、里氏代换原则、合成复用原则。设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。
  1、"开-闭"原则
  此原则是由"Bertrand Meyer"提出的。原文是:"Software entities should be open for extension,but closed for modification"。就是说模块应对扩展开放,而对修改关闭。模块应尽量在不修改原(是"原",指原来的代码)代码的情况下进行扩展。那么怎么扩展呢?我们看工厂模式"factory pattern":假设中关村有一个卖盗版盘和毛片的小子,我们给他设计一"光盘销售管理软件"。我们应该先设计一"光盘"接口。如图:
  [pre]______________
  |<>|
  | 光盘 |
  |_____________|
  |+卖() |
  | |
  |_____________|[/pre]
  而盗版盘和毛片是其子类。小子通过"DiscFactory"来管理这些光盘。代码为:
  public class DiscFactory{
  public static 光盘 getDisc(java/lang/String.java.html" target="_blank">String name){
  return (光盘)java/lang/Class.java.html" target="_blank">Class.forName(name).getInstance();
  }
  }
  有人要买盗版盘,怎么实现呢?
  public class 小子{
  public static void main(java/lang/String.java.html" target="_blank">String[] args){
  光盘 d=DiscFactory.getDisc("盗版盘");
  光盘.卖();
  }
  }
  如果有一天,这小子良心发现了,开始卖正版软件。没关系,我们只要再创建一个"光盘"的子类"正版软件"就可以了。不需要修改原结构和代码。怎么样?对扩展开发,对修改关闭。"开-闭原则"
  工厂模式是对具体产品进行扩展,有的项目可能需要更多的扩展性,要对这个"工厂"也进行扩展,那就成了"抽象工厂模式"。
  2、里氏代换原则
  里氏代换原则是由"Barbara Liskov"提出的。如果调用的是父类的话,那么换成子类也完全可以运行。比如:
  光盘 d=new 盗版盘();
  d.卖();
  现在要将"盗版盘"类改为"毛片"类,没问题,完全可以运行。Java编译程序会检查程序是否符合里氏代换原则。还记得java继承的一个原则吗?子类override方法的访问权限不能小于父类对应方法的访问权限。比如"光盘"中的方法"卖"访问权限是"public",那么"盗版盘"和"毛片"中的"卖"方法就不能是protected或private,编译不能通过。为什么要这样呢?你想啊:如果"盗版盘"的"卖"方法是private。那么下面这段代码就不能执行了:
  光盘 d=new 盗版盘();
  d.卖();
  可以说:里氏代换原则是继承复用的一个基础。
  3、合成复用原则
  就是说要少用继承,多用合成关系来实现。我曾经这样写过程序:有几个类要与数据库打交道,就写了一个数据库操作的类,然后别的跟数据库打交道的类都继承这个。结果后来,我修改了数据库操作类的一个方法,各个类都需要改动。"牵一发而动全身"!面向对象是要把波动限制在尽量小的范围。
  在Java中,应尽量针对Interface编程,而非实现类。这样,更换子类不会影响调用它方法的代码。要让各个类尽可能少的跟别人联系,"不要与陌生人说话"。这样,城门失火,才不至于殃及池鱼。扩展性和维护性才能提高
  理解了这些原则,再看设计模式,只是在具体问题上怎么实现这些原则而已。张无忌学太极拳,忘记了所有招式,打倒了"玄幂二老",所谓"心中无招"。设计模式可谓招数,如果先学通了各种模式,又忘掉了所有模式而随心所欲,可谓OO之最高境界。呵呵,搞笑,搞笑!(JR)
  4 依赖倒转原则
  抽象不应该依赖与细节,细节应当依赖与抽象。
  要针对接口编程,而不是针对实现编程。
  传递参数,或者在组合聚合关系中,尽量引用层次高的类。
  主要是在构造对象时可以动态的创建各种具体对象,当然如果一些具体类比较稳定,就不必在弄一个抽象类做它的父类,这样有画舌添足的感觉
  5 接口隔离原则
  定制服务的例子,每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干
  6 抽象类
  抽象类不会有实例,一般作为父类为子类继承,一般包含这个系的共同属性和方法。
  注意:好的继承关系中,只有叶节点是具体类,其他节点应该都是抽象类,也就是说具体类
  是不被继承的。将尽可能多的共同代码放到抽象类中。
  7 迪米特法则
  最少知识原则。不要和陌生人说话。

一个模式的四个基本要素

  设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
  1. 模式名称(pattern name)
  一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到恰当的模式名也是我们设计模式编目工作的难点之一。
  2. 问题(problem)
  描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
  3. 解决方案(solution)
  描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
  4. 效果(consequences)
  描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
分享到:
评论

相关推荐

    面向对象应用分析和设计

    面向对象方法论的发展离不开几位在OO领域举足轻重的人物,其中包括: - Grady Booch:是OO方法学的先驱,开发了Booch方法,后与Rumbaugh和Jacobson共同贡献于UML的创建。 - Ivar Jacobson:引入用例(Use Cases)...

    深入浅出设计模式.pdf

    同时,模式的应用也离不开面向对象设计原则的支持,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。 总的来说,《深入浅出设计模式》是一本帮助开发者提升软件设计能力的优秀教程,通过学习...

    设计模式总结篇

    本文旨在总结和探讨设计模式的相关知识,包括架构设计原则、设计模式的应用以及面向对象编程的基本理念等,希望能够为广大开发者提供有价值的参考资料。 #### 架构设计与设计模式的重要性 任何一款优秀的软件产品...

    清华大学面向对象android客户端源码.rar

    在移动开发领域,Android系统占据着主导地位,其应用程序的开发离不开Java语言的面向对象特性。本篇将深入解析“清华大学面向对象Android客户端源码”,探讨其中的关键技术和设计模式,为开发者提供一个学习和研究的...

    24种设计模式介绍与6大设计原则

    设计模式的正确使用离不开以下六项基本原则: **1. 单一职责原则 (Single Responsibility Principle)** 一个类应该只负责一项职责。如果一个类承担了多项职责,则这些职责应该被分离到不同的类中。 **2. 里氏替换...

    c++设计模式实现

    C++是一种强大而灵活的面向对象编程语言,它非常适合实现各种设计模式。以下是对标题"**C++设计模式实现**"和描述中涉及的知识点的详细说明: 1. **简单工厂模式**:这是一种创建型模式,它提供了一个接口来创建...

    C#设计模式大全

    C#作为一种现代面向对象的编程语言,其设计模式的应用离不开对面向对象基本原则的理解。在深入探讨设计模式之前,我们首先回顾C#中的面向对象特性: 1. **封装**:通过将数据和操作这些数据的方法封装在一个类中来...

    程序员面试刷题的书哪个好-Design-Pattern:设计模式(DesignPattern)代表了最佳的实践,在面向对象的编程中被很多老鸟们

    谈及设计模式,必然离不开GoF: GoF:Gang of Four,也称为“四人组”,即:EErich Gamma、Richard Helm、Ralph Johnson 和John Vlissides 四人。 1994 年,这几位大牛合着出版了一本名为《Design Patterns: ...

    Design.Patterns.rar 设计模式

    数据结构和算法是编程的基础,设计模式的实现往往离不开高效的数据结构和算法支持。例如,享元模式(Flyweight)利用共享技术有效地支持大量细粒度的对象,这就需要对内存管理和数据存储有深入理解。此外,策略模式...

    50道Java常见编程题(有精力的同学看看).rar

    Java上机编程能力的提升离不开实际操作。这份文档可能包含了一些经典问题,例如实现简单的数据结构(如栈、队列、链表),字符串操作,数组排序算法(如冒泡排序、选择排序、快速排序),文件和I/O流的使用,集合...

    《前端内参》,有关于JavaScript、编程范式、设计模式、软件开发的艺术等大前端范畴内的知识分享,旨在帮助前端工.zip

    而面向对象编程则通过封装、继承和多态来组织代码,适合构建复杂系统。了解并熟练运用这些范式,能提升代码的可读性和可复用性。 设计模式是软件工程中的最佳实践,对于前端开发同样重要。如单例模式确保一个类只有...

    程序员编程艺术系列之程序员编程艺术

    2. **算法与数据结构**:编程艺术离不开高效的算法和合理的数据结构。书中可能会详细解析常见的排序算法(如冒泡排序、快速排序、归并排序)、查找算法(如二分查找、哈希查找)以及链表、树、图等基本数据结构的...

    完美编程

    2. **算法与数据结构**:高效的编程离不开对算法的理解和应用。排序、查找、图论、动态规划等是常见问题解决方法。数据结构如数组、链表、栈、队列、树、图等则是存储和操作数据的关键工具。 3. **面向对象编程**:...

    Java常用的23种设计模式在这儿咯,怎么说?打包拿走吧!就是这么捞..

    Java作为一种广泛应用的编程语言,其开发过程中同样离不开设计模式的运用。标题提到的"Java常用的23种设计模式"涵盖了创建型、结构型和行为型三大类,这些模式帮助我们写出可维护、可扩展、易理解的代码。 1. **...

    JAVA61条面向对象设计的经验原则

    封装是面向对象编程的一个核心特性,它允许我们将数据(即类的属性)与操作这些数据的方法捆绑在一起,并通过访问控制机制来保护这些数据不被外部直接访问或修改。这种做法可以有效地限制对类内部状态的访问,从而...

    坦克游戏,用于复习设计模式,java基础和网络应用.zip

    例如,面向对象编程(OOP)思想贯穿整个游戏,类和对象的定义、继承、封装和多态性都有所体现。异常处理(Exception Handling)确保了程序的稳定运行,线程同步(Thread Synchronization)使得多个坦克能够并发移动...

    VC高级编程源代码下载,超赞!

    8. **算法与数据结构**:高级编程往往离不开高效的算法和数据结构。源代码中可能会有排序、搜索或其他算法的实现,帮助你提升算法设计能力。 9. **设计模式**:源代码可能应用了如工厂模式、单例模式、观察者模式等...

    EmloyeeSystemDesignPatterns:这是一个.NET MVC Core项目,旨在使用LINQEF Core在SQL数据库中查询和执行操作来跟踪数据库中的员工记录。 该项目的体系结构利用了不同的设计模式,例如简单工厂,工厂方法设计模式等,以及面向对象原理的概念

    在实际运行中,此系统可能还包括身份验证、授权、错误处理、日志记录等功能,这些都离不开对设计模式和面向对象原则的灵活运用。通过这样的架构设计,系统能够更好地应对需求变化,保证代码的可扩展性和可维护性。 ...

    C++高质量编程(林锐)

    9. **测试和调试**:高质量的编程离不开有效的测试和调试。林锐可能会讨论单元测试、集成测试以及调试工具的使用。 10. **代码风格和文档**:良好的编码风格和详尽的文档是代码可读性和可维护性的保证。书中会强调...

Global site tag (gtag.js) - Google Analytics