什么是设计模式
20世纪60年代的软件危机使得人们开始重视软件工程的研究。起初,人们把软件设计的重点放在数据结构和算法的选择上。随着软件系统规模越来越大、越来越复杂,整个系统的结构和规格说明也显得越来越重要。面对日益复杂的软件系统,人们开始认识到,要真正实现软件的工业化生产方式,达到软件产业发展所需要的软件生产率和质量,软件复用是一条现实可行的途径。
1995年,《Design Pattern》(中译“设计模式”)一书问世,成为面向对象编程中使用模式化方法的开创性著作。这本书对于软件实践中的一些不断变换面孔重复出现、但特征和解决方案的本质却十分类似的问题进行了总结归纳,提炼出23个具有代表性的模式。设计模式本身并不是一种具体的“技术”,它讲述的是思想。它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,还让开发人员能够真正掌握接口或抽象类的应用。更重要的是,该书提炼的这些设计模式反复强调的宗旨是尽量提高程序的使用率,让程序尽可能的可重用。
Java中的设计模式
Java语言作为面向对象编程语言的优秀代表,它拥有简单易用的特性,以及强大的功能,非常有利于设计模式的实施。Java发展到现在,按应用主要分为三大块:J2SE、J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入式系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于大型分布式网络程序的开发,如电子商务网站和ERP系统。Java技术已经逐渐成为电子商务主流技术之一。在Java的各个平台中,设计模式有很多精彩的应用,而且随着Java技术的不断发展,设计模式也在不断丰富。
J2SE与设计模式
早期发布的设计模式主要来自桌面应用软件的开发经验。在《Design Pattern》一书中,所有的模式都是通过面向桌面应用的窗口程序来举例说明的。相应的在J2SE中,贯穿了设计模式的思想,尤其是大量运用了MVC模式。
所谓MVC模式,是指模型(Model)、视图(View)和控制(Control)相分离的设计方案。模型(Model)是执行某些任务的代码。至于这些任务以什么形式显示给用户,却并不是模型所关注的问题。模型只有纯粹的功能性的接口,也就是一系列的公开方法。这些方法有的是取值方法,让系统其它部分可以得到模型端的内部状态参数;有的是改值方法,允许外部修改模型的内部状态。
视图决定模型以什么样的方式显示给用户。一个模型可以对应多个视图,那么对于视图而言,模型就是可重用的代码。一般来说,模型内部必须留下所有对应视图的记录,以便在模型的状态发生改变的时候,可以通知视图。模型的状态一旦发生改变,所有对应的视图都能够得到更新。
控制是和视图联合使用的。用户在与视图发生交互的时候,是通过控制器来操纵模型,从而向模型传递数据、更新模型的状态。
例如,一个表格数据体可以看作是一个模型,它可以对应成为多种视图,比如饼图、棒图或者直接显示成为一个表格。用户通过键盘和鼠标与视图进行交互,从而激发相应的控制器改变表格数据。一旦表格数据发生变化,视图会得到通知,进而更新显示的形式。
MVC模式是最著名的模式之一。J2SE中一些复杂的显示控件(如表格、列表、树等),都使用了这种模式,从而使得设计结构非常清晰而且灵活。当然,也有人提出,MVC模式不应当被称为“设计模式”,而应当属于“架构模式”。它可以看作若干个设计模式的组合,并且在不同的应用环境中衍生出了其它的一些设计模式。但是在各种讨论中,MVC模式还是常常被当作设计模式。
J2EE与设计模式
J2EE属于一种框架软件。什么是框架软件?它不同于以前接触的Java API等,那些API属于Toolkit(工具箱)。而J2EE不再被动地被使用、被调用,而是深刻地介入到一个领域中去。J2EE设计的目的是将企业计算应用领域中不变的东西先定义好,比如整体结构和一些主要职责(如数据库操作、事务跟踪和安全等),剩余的就是变化的东西,即针对这个领域中具体应用所产生的不同的变化需求,而这些变化的东西就是J2EE程序员所要做的。因此,设计模式和J2EE在思想和动机上是一脉相承的。只不过设计模式更抽象,几乎可以用于任何应用;J2EE则是适合企业计算应用的框架软件,而设计模式是它的重要的理论基础之一。
与此同时,在J2EE的框架下,一些应用级的设计模式也逐步积累了起来,关于设计模式在J2EE中的应用已成为许多论坛讨论的热点之一。其中,J2EE Web应用的架构设计引起了高度的关注。J2EE体系包括JSP、Servlet、EJB、Web服务等多项技术。这些技术的出现给电子商务时代的Web应用开发提供了一个非常有竞争力的选择。怎样把这些技术组合起来,形成一个适应项目需要的稳定架构是项目开发过程中非常重要的步骤。此步骤一般由架构设计师完成,设计师根据项目需求,对J2EE体系中的各种技术进行筛选取舍,并考虑到开发过程中的角色分工、后期的运行维护,以及系统扩展性等诸多因素建立系统的架构。一个成功的软件需要有一个成功的架构,但软件架构的建立是一个复杂而又持续改进的过程,软件开发者们不可能对每个不同的项目做不同的架构,而总是尽量重用以前的架构,或开发出尽量通用的架构方案。
在当前的J2EE Web应用中,Apache Struts是最流行的架构方案之一。它实现了MVC模式的概念,并将这些概念映射到Web应用程序的构件和概念中。Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架,其目的是帮助开发人员减少在运用MVC设计模型开发Web应用的时间。
Apache Struts有以下的优点:一些开发商开始采用并推广这个框架;作为开源项目,有很多先进的实现思想;对大型应用支持的较好;有集中的网页导航定义。Apache Struts正在获得越来越多的关注与支持。
J2ME与设计模式
J2ME标准为消费类产品(例如移动电话、双向传呼机和无线个人信息管理器)的应用开发提供支持。这一类产品的特点是,显示能力和存储能力有限,计算能力和网络访问能力不够强大。因此,J2ME设计模式就有了它所独特的问题领域。比如,如果需要显示比较大的数据集合,那么应该采取什么样的解决方案,才能适应狭小的显示区域?又比如,如果需要实现类似桌面软件的选单选择的功能,那么应该如何设计才能够足够简练和便于重用?J2ME的设计模式正在逐步的积累过程中,我们相信随着J2ME的推广J2ME设计模式的讨论也将逐步成为一大关注热点。
Java与设计模式的结合,为Java的发展带来了更大的活力,也为设计模式提供了一个宽阔的舞台。在这些技术的共同推动下,软件产业将以坚实的步伐走进工业化时代。
=================================================================================
什么是设计模式
设计模式是一系列在实践中总结出来的可复用的面向对象的软件设计方法,最早由GoF的"Design Patterns"提出。
GoF的23种经典设计模式
Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides四人合著的"Design Patterns: Elements of Reusable Object-Oriented software"(中文名:设计模式:可复用面向对象软件的基础)一书奠定了设计模式的基础。GoF将23种设计模式分为创建型模式,结构型模式和行为模式三类:
Creational Patterns 创建型模式 | ||
Abstract Factory 抽象工厂 | Provide an interface for creating families of related or dependent objects without specifying their concrete classes. | 详细内容>> |
Builder 建造者 | Separate the construction of a complex object from its representation so that the same construction process can create different representations. | 详细内容>> |
Factory Method 工厂方法 | Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. | 详细内容>> |
Prototype 原型 | Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype. | 详细内容>> |
Singleton 单例 | Ensure a class only has one instance, and provide a global point of access to it. | 详细内容>> |
Structural Patterns 结构型模式 | ||
Adapter 适配器 | Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces. | 详细内容>> |
Bridge 桥接器 | Decouple an abstraction from its implementation so that the two can vary independently. | 详细内容>> |
Composite 合成模式 | Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. | 详细内容>> |
Decorator 装饰 | Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. | 详细内容>> |
Facade 门面 | Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use. | 详细内容>> |
Flyweight 享元 | Use sharing to support large numbers of fine-grained objects efficiently. | 详细内容>> |
Proxy 代理 | Provide a surrogate or placeholder for another object to control access to it. | 详细内容>> |
Behavioral Patterns 行为模式 | ||
Chain of Responsibility 责任链 | Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it. | 详细内容>> |
Command 命令模式 | Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations. | 详细内容>> |
Interpreter 解释器 | Given a language, define a represention for its grammar along with an interpreter that uses the representation to interpret sentences in the language. | 详细内容>> |
Iterator 迭代器 | Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. | 详细内容>> |
Mediator 中介者 | Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently. | 详细内容>> |
Memento 备忘录 | Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later. | 详细内容>> |
Observer 观察者 | Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. | 详细内容>> |
State 状态 | Allow an object to alter its behavior when its internal state changes. The object will appear to change its class. | 详细内容>> |
Strategy 策略 | Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it. | 详细内容>> |
Template Method 模板方法 | Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. | 详细内容>> |
Visitor 访问者 | Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. | 详细内容>> |
J2EE设计模式
J2EE现已有大量成熟的模式如Command,Value Object,Service Locator等等。
设计模式推荐书籍
设计模式实例学习
Java作为优秀的面向对象的编程语言,特别适合应用设计模式来实现优秀的应用。SUN提供的应用设计模式的优秀示例有:
Java Pet Store:一个在线宠物店,应用EJB作为业务实现,JSP/Servlet/Filter实现的MVC Web层,是学习J2EE的好教材。 详细内容>>
Smart Ticket:一个在线预订电影票的应用,结合J2EE和J2ME,使用J2EE作为服务程序,J2ME作为手机客户端程序,从而使用户通过无线网络实现电子商务的应用。此示例不但有J2EE的架构设计,而且涉及到手机端的MIDP设计和实现。 详细内容>>
开源社区也有大量优秀的设计:
Jive Forum:一个使用Java实现的论坛,应用了大量设计模式,值得研究。Jive最初是免费的,但最新版本已经商业化。 详细内容>>