在开发人员的圈子中,大家通过相互交流在开发过程中所遇到的问题以及解决方法来丰富整个圈子的经验。而设计模式就是在这样的情况下产生的。一个设计模式必然是针对某个特定的问题的,这个问题的解决方案以及这样解决问题产生的后果。在解决利用J2EE进行程序开发中出现的问题的过程中,人们把设计模式分为两类,一种是通用开发模式,一种是为了解决特定的J2EE问题的模式。下面让我们来看一看每一种类型的开发模式都包含了哪些内容。
架构模式
通常说的MVC就是一种架构模式,我们不要把MVC当为一种设计模式。
J2EE设计模式
J2EE设计模式在过去几年中随着Java开发人员经验的不断成长而发展。这些设计模式是针对使用各种J2EE技术时可能出现的问题提出的,它们能够帮助开发人员构造出应用程序框架的要求。例如,Front Controller(前端控件)模式将servlet代码的开发转化为在图形用户界面下的开发。但是需要记住J2EE设计模型解决了那些在J2EE项目中最可能出现的问题。如果你在J2EE遇到的问题很特殊,很有可能没有相应的设计模型来解决它。
软件开发设计模式
软件开发设计模式又被分为两种,一种是通用的面向对象设计模式。例如工厂(Factory)模式是一种面向对象的设计模式,它将对象的创建封装起来,使对象能够重用,这样就可以减少程序占用的系统资源。而另一种是基于Java的设计模式,这些设计模式要么是和Java的语言特性结合得很紧,要么是面向对象技术在Java中的深化。不要以为软件设计模式相对独立于J2EE就认为它们不重要,通常它们比J2EE设计模式更重要。这是因为:
1)J2EE设计模式是近几年才出现的,并且在不断变化,而软件开发设计模式经过了长时间的考验,比前者更加成熟和完善;
2)有些J2EE设计模式是建立在某些软件开发设计模式之上的;
3)软件开发模式为J2EE设计模式提供了坚实的基础。它的应用将影响到整个结构的稳定性和可扩充性。
在实际应用中,设计模式并不是一段具体的代码。设计模式通常是在设计说明书中描述。将设计模式应用到系统中的真正挑战在于如何在系统中应用模式中的思想。这些思想必须被应用到恰当的环境中。
根据设计模式的所解决的问题,又可以分为以下几个类型:
· 创建类型:创建类型的模式都是用于创建类的实例。但是和通过new来创建实例不同,这些模式提供了更加灵活的方式,是程序能够根据特定的情况创建特定的类。
· 结构类型:结构类型的模式帮助开发人员将简单对象组合在一起以后的更加复杂的结构。
· 行为类型:行为类型的模式帮助开发人员控制类之间的通讯。
创建类型的模式
所有创建类型的模式都和如何有效地创建类的实例相关。在Java中,如果开发人员要生成一个类的实例,最简单的方法是使用new关键字:
MyFoo = new Foo(); // 生成一个Foo的实例 |
这种方法只能够在程序中生成固定的类。但是在很多情况下,程序需要根据不同的情况生成不同的类的实例,这就需要将实例的生成过程抽象到一个特殊的创建类中,由该类在运行时决定生成哪种类的实例。这样使得程序有更好的灵活性和通用性。
创建类型的模式包括:
· 工厂模式(Factory Pattern):根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,而这一组类有一个公共的抽象父类。
· 抽象工厂模式(Abstract Factory Pattern):抽象工厂模式也可以根据提供的数据生成一组类中某一个类的实例,而这一组类有一个公共的抽象父类。只不过它定义的是一个接口。
· 构造者模式(Builder Pattern):构造者模式将一个复杂对象的构造过程和它的表现层分离开来,这样类就可以根据不同情况展现出不同的表现方式。
· 原型模式(Prototype Pattern):原型模式通过对类的实例进行拷贝来创建新的实例。
· 单例模式(Singleton Pattern):根据单一模式实现的类只允许有一个是类,并且提供了一个全局指针来引用该实例。
结构类型的模式
结构类型的模式将类和对象组合起来,以构成更加复杂的结构。它又被划分为类模式和对象模式。类模式和对象模式之间的区别在于类模式通过继承关系来提供有效的接口;而类模式通过对象合成或将对象包含在其它对象中的方式构成更加复杂的结构。
结构类型的模式包括了以下模式:
· 适配器模式(Adapter Pattern):适配器模式可以将一个类的接口和另一个类的接口匹配起来。
· 桥梁模式(Bridge Pattern):桥梁模式对客户端程序提供一个固定的接口,但是允许开发人员变化实际的实现类。这样开发人员就可以将接口是具体的实现类分离开来。
· 组合模式(Composite Pattern):复合模式可以将多个对象进行复合,其中的每个对象可以是简单对象,也可以是复合对象。
· 代理模式(Proxy Pattern):代理模式利用一个简单的对象替代一个复杂的对象,当复杂对象在需要的时候才会被加载到系统中,这样可以节约系统资源,提高系统的响应速度。在网络环境中这种模式很有用处。
· 装饰者模式(Decorator Pattern):通过修饰模式,开发人员可以在运行时将特定的功能绑定在对象上。
· 享元模式(Flyweight Pattern):轻量模式通过将对象中的一部分数据保存在对象外,在调用对象中的方法时再将这些数据传回对象。这样做可以减少大量比较简单的对象占用的空间。
· 门面模式(Facade Pattern):正面模式将复杂的类层次结构组织起来,通过一个简单的接口来获得层次结构中的数据。
行为类型的模式
行为类型的模式主要是那些处理对象之间通讯的模式,该类型的包括以下模式:
· 观察者模式(Observer Pattern):观测者模式可以在发生变化时将变化通知多个类。
· 调停者模式(Mediator Pattern):中介模式可以通过一个中间类来控制若干个类之间的通讯,并且这些类相互之间不需要了解对方的信息。
· 备忘录模式(Memento Pattern):回忆模式可以在不破坏对象封装性的前提下保存和恢复对象的内部状态。
· 责任链模式(Chain of Responsibility):职责链模式将请求传递给一组对象,只有特定的对象才会处理该请求。这样就进一步削弱类之间的联系。
· 命令模式(Command Pattern):命令模式将请求传递给特定的对象,这样客户端即使在不知道服务器端如何处理请求的情况下也可以发送请求。
· 模板方法模式(Template Method Pattern):模板模式提供了对算法的抽象定义。
· 策略模式(Strategy Pattern): 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
· 访问者模式(Visitor Pattern):访问者模式通过一个访问类来访问其他类中的数据。
· 状态模式(State Pattern):状态模式将一个类实例的变量保存在独立的内存空间中。
· 迭代子模式(Iterator Pattern):迭代模式在不知道数据的内部表现形式的前提下,通过标准的接口来遍历数据集合中的数据。