跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——工厂模式
- 格式:pdf
- 大小:124.10 KB
- 文档页数:6
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——值列表处理器(Value List Handler)模式1.1.1值列表处理器模式(Value List Handler)1、应用的技术背景(1)查询操作通常涉及大型数据集许多J2EE应用程序都要求显示作为用户查询结果的数据库记录清单。
这些查询操作通常涉及到在服务器端处理大型数据集。
例如,在包含数千种产品的在线产品目录中进行的典型查找过程。
(2)如何在可伸缩性和性能方面进行合理地折中在并发客户数量增加的情况下,处理大型结果集的应用程序将面临可伸缩性和性能方面的问题。
根据用户提出来的查询条件执行查询过程时,很可能没有办法预测会有多少数据返回。
这个结果记录集可能包含庞大的数据量,这样您不能盲目的把查询结果返回客户,否则将导致意外的性能问题。
(3)使用值列表处理器模式为了管理大型数据库返回记录集,人们经常使用Value List Handler这种设计模式。
2、值列表处理器模式的工作原理(1)控制搜索、缓存查找结果J2EE Blueprint 推荐使用这种模式来控制搜索、缓存查找结果并把查找结果提供给客户。
下图显示了一个Web客户、一个值列表处理器和一组基层实体EJB之间的关系。
(2)以分页方式迭代返回在这一解决方案中,当客户需要搜索数据时,Value List Handler就被调用,它截取客户搜索请求并把结果记录集以分页方式迭代返回。
ValueListHandler提供有查询执行功能和结果缓存。
(3)ValueListHandler是一个集合类而其中的ValueListHandler是一个集合类(并且ValueListHandler总是隐藏在façade门面的后面),它包含一组表示数据库记录的Transfer Object。
在这个设计模式中,该处理程序并不返回整个结果清单,它只返回数据的一个子集。
3、值列表处理器模式中的数据源一般是作为一个有状态会话bean实现的,它要求基层的数据源获取所需的数据。
1.1跟我学J2EE 系统构架和设计模式——Java平台中的各种数据访问设计模式1、Java平台中的各种数据持久化技术大多数应用程序都需要处理数据。
Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法。
有时候,甚至在编写应用程序之前,数据就已经存在了,所以需要有读入它们和将其表示为对象的方法。
手动编写代码来执行这些任务不仅单调乏味、易于出错,而且会占用整个应用程序的很大一部分开发工作量。
(1)JDBC大多数Java开发员都是用JDBC来和数据库进行通信,它可以通过DAO(Data Access Object)模式来进行改善和提高,然而,这种方式在大型应用程序中则会造成维护的“高消费”"。
JDBC 提供了还算不错的数据库抽象,但是需要用痛苦的API。
这些问题包括:1)需要冗长的错误处理代码来确保ResultSets,Statements以及(最重要的)Connections在使用后关闭。
这意味着对JDBC的正确使用可以快速地导致大量的代码量。
它还是一个常见的错误来源。
Connection leak可以在有负载的情况下快速宕掉应用程序。
2)SQLException相对来说不能说明任何问题。
JDBC不提供异常的层次,而是用抛出SQLException来响应所有的错误。
找出到底哪里出错了——例如,问题是死锁还是无效的SQL?——要去检查SQLState或错误代码。
这意味着这些值在数据库之间是变化的。
为了便于理解,让我们来看一段传统的JDBC代码:Connection conn =null;Statement stmt = null;try{conn = dataSource.getConnection();stmt = con.createStatement();stmt.executeUpdate("UPDATE userInfo SET age = 18 WHERE id = 'erica'"); }catch(SQLException e){}finally{if (stmt != null){try{stmt.close();}catch (SQLException ex){logger.warn("Exception in closing JDBC Statement", ex);}}if (conn != null){try{conn.close();}catch (SQLException ex){logger.warn("Exception in closing JDBC Connection", ex);}}}类似上面的代码非常常见。
j2ee中最常用设计模式创建型模式:1.Factory Pattern 工厂模式概述:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
FactoryMethod使一个类的实例化延迟到其子类。
适用性:1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
类图:2.Singleton Pattern 单例模式概述:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性:1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
类图:结构型模式:3.Façade Pattern 外观模式概述:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用性:1.当你要为一个复杂子系统提供一个简单接口时。
子系统往往因为不断演化而变得越来越复杂。
大多数模式使用时都会产生更多更小的类。
这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。
Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。
2.客户程序与抽象类的实现部分之间存在着很大的依赖性。
引入facade 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3.当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。
如果子系统之间是相互依赖的,你可以让它们仅通过facade 进行通讯,从而简化了它们之间的依赖关系。
类图:4.Adapter Pattern 适配器模式概述:将一个类的接口转换成客户希望的另外一个接口。
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——数据访问对象(data access object,DAO)模式1.1.1数据访问对象(data access object,DAO)模式1、DAO模式(1)DAO模式简介将对数据源的访问(也就是获得数据库的连接)抽象为一个类,从而利用数据访问对象可以实现对不同数据库类型和形式的数据资源进行访问。
(2)应用的技术背景1)这种模式出现的背景在于数据访问的逻辑极大程度上取决于数据存储的格式2)比如说关系型数据库、面向对象数据库、磁盘文件等。
2、为什么要使用DAO模式1)目前大部分的J2EE应用程序都需要在一定程度上使用可持久性的数据,而实现持久性数据的方法因应用程序不同而异,并且访问不同存储格式数据的应用程序接口(API)也有着显著的差别;2)有的时候,应用程序还会访问存储在不同操作平台上的数据,这使得问题更为复杂3)在Java语句中可以嵌入SQL语句,用以访问关系型数据库,当然根据数据库类型的不同,SQL语句的词法和语法也会有所不同;4)需要说明的是,当数据存储格式不同的时候,数据访问逻辑的区别就更加明显了,例如关系型数据库、面向对象数据库和磁盘文件,各自数据的访问逻辑各有千秋,这样一来就造成了程序代码和数据访问代码之间的依赖关系3、DAO模式的类图和序列图(1)类图(2)序列图对上面的各个对象的说明1)业务对象(Business Object)。
表示数据的用户,它需要对于数据的访问,一个业务对象可以用会话bean、实体bean或是其他Java程序来实现。
2)数据访问对象(Data Access Object)。
数据访问对象是这种模式中的主题,它提供了底层数据访问的对象,并将其提供给业务对象以使得后者能够透明地访问数据源;同时业务对象也将数据的加载和存储操作移交给数据访问对象处理。
3)数据源(Data source)。
这里指的是数据源的物理实现,这个数据源可以是一个数据库,包括关系型数据库、面向对象数据库或文件系统。
1.1跟我学软件系统业务层模块设计中所涉及的J2EE核心设计模式和GOF程序代码设计模式(第1部分)在本单元中希望重点了解和掌握如下的业务层设计模式的具体应用:服务定位器模式,单例设计模式,商业业务代理类模式,Iterator模式,观察者(OBSERVER)模式,本地访问模式,会话门面模式,消息门面模式,中介模式。
1.1.1服务定位器模式(ServiceLocator)1、应用的技术背景在B/S开发中,我们经常要用到名称服务,如JNDI,XMLNS等。
名称服务随不同厂家而不同。
每次需要获得名称服务时,需要适当的名称环境信息,然后查找服务,重复查找的成本很高。
如果服务被各种客户端使用,那么用于查找对象的代码将以各种形式重复,这使得维护应用程序变得非常困难。
因此,这就要求我们对这些访问进行封装隔离。
这时我们就可以利用SERVICE LOCATOR模式----“服务定位器”(Service Locator)模式模式背后的基本思想是:有一个对象(即服务定位器)知道如何获得一个应用程序所需的所有服务。
2、服务定位器模式服务定位器模式降低了客户的复杂度,这种复杂度由客户端的依赖,操作需要,查找和创建过程产生,这些都是与资源紧密联系的。
为了消除这些问题,这个模式提供了一种技术来抽象所有的依赖性和网络细节到服务定位器中。
3、服务定位器模式的作用1)简化客户端查询的杂性:使用服务定位器对象来抽取所有的JNDI应用,并且隐蔽最初Context 的初始化、EJB对象对象查找和EJB对象narrow重创建的复杂性。
2)将JNDI集中处理:多个客户端可以重新使用服务定位器对象来降低代码的复杂性,提供一致控制,并且通过提供缓冲机制来提高性能。
3)业务逻辑代码使用服务定位器避免目录查找代码变得混乱。
注意:1)很多框架系统已经将服务定位器模式包含在其系统程序中,比如在Struts和Spring中的<datasource>的配置。
1.1J2EE软件系统项目模块设计中所涉及的设计模式1、模式分为三个层次:架构模式,模块设计模式和模块实现模式(1)架构模式是模式中的最高层次,描述软件系统里的基本的结构组织或纲要,通常提供一组事先定义好的子系统,指一它们的责任,并给出把它们组织在一起的法则和指南。
(2)模块设计模式用来处理程序设计中反复出现的问题。
如GOF提出的23个基本设计模式(3)模块实现模式是最低也是最具体的层次,处理具体到与编程语言相关的问题。
2、模块设计模式(1)合理地使用设计模式真正掌握设计模式需要在实践中不断研究和使用,创建模式的人是大师,但是拘泥于模式的人永远是工匠。
在EJB的具体使用中,使用合适的设计模式,不但使代码可重用性可拓展性增强,最重要的是能提高效率和速度,我们知道EJB框架由于考虑大型系统中事务安全等各方面问题,效率性能有所欠缺,那么我们在具体问题具体应用时,使用设计模式可以弥补这个问题。
(2)设计模式是思想GoF的设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java 语言基础上跃进一步,更重要的是,GoF的设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
3、GOF的23种设计模式中比较常用的部分模式说明(1)创建型的模式1)设计模式之Factory(工厂方法和抽象工厂):使用工厂模式就象使用new 一样频繁.2)设计模式之Prototype(原型):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3)设计模式之Builder:汽车由车轮方向盘发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这两种情况分开进行。
4)设计模式之Singleton(单态):保证一个类只有一个实例,并提供一个访问它的全局访问点(2)结构型的模式1)设计模式之Façade:可扩展的使用JDBC 针对不同的数据库编程,Facade 提供了一种灵活的实现。
J2EE常见设计模式(⼀)J2EE常见设计模式Abstract Factory(抽象⼯⼚)抽象⼯⼚,按字⾯含义来理解,就是⼀个不存在的⼯⼚,只是抽象出来的⼀个概念⼯⼚,反应到代码中,可以理解为定义了固定操作接⼝的⼀个抽象类,这个类不完成任何事(特殊情况也可以完成某些⽣产操作),⽽是交由它的⼦类来进⾏实际的操作。
理解概念总是困难的,因此⽤⽐喻的⽅式总是容易让⼈理解,这⾥我举个例⼦来说明抽象⼯⼚,在我们写代码的过程中,经常会牵扯到界⾯元素的变动,⽐如常见的什么Xp样式风格、Office2003风格、Vista风格等等,例⼦中,我以⽣成⽂本框、复选框为例,来说明抽象⼯⼚模式。
不论什么风格,它们都是控件,因此都会有创建⽂本框及复选框的⽅法,这些⽅法就是⼯⼚⽅法,代码如下:abstract class ControlFactory{public abstract TextBox CreateTextbox();public abstract CheckBox CreateCheckbox();}class StandardControlFactory : ControlFactory{public StandardControlFactory() { }public override TextBox CreateTextbox(){return new TextBox();}public override CheckBox CreateCheckbox(){return new CheckBox();}}StandardControlFactory类是创建标准控件的⼀个实现⼯⼚,同样我们要实现XP样式的⽂本框创建,则重新继承⼀下抽象⼯⼚类即可,代码如下:class XpControlFactory : ControlFactory{public XpControlFactory() { }public override TextBox CreateTextbox(){TextBox tb = new TextBox();//对tb对象进⾏XP样式修改return tb;}public override CheckBox CreateCheckbox(){CheckBox ck = new CheckBox();//对ck对象进⾏XP样式修改return ck;}}在客户端使⽤的时候,通过送⼊不同的实现⼯⼚,即可实现对界⾯的修改,例如:public Panel CreateInterface(ControlFactory factory){Panel p = new Panel();p.Controls.Add(factory.CreateCheckbox());p.Controls.Add(factory.CreateTextbox());return p;}上⾯的代码中,要修改不同风格的控件,只需要送⼊不同的抽象⼯⼚实例即可。
java设计模式:工厂模式
导语:Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java 语言具有功能强大和简单易用两个特征。
下面我们来看看工厂模式,希望对大家有所帮助。
工厂设计模式
★场景和问题
面向接口编程是java编程中的大家所公认的第一原则接口很重要的一个功能:封装隔离。
接口是功能块或封装块的外观。
Java程序开发讲究面向接口编程,隐藏具体的实现类,可是如何得到接口呢?
通过工厂来获得接口。
工厂的本质是“选择实现”
工厂、接口和实现类之间的技术边界:工厂只负责选择实现,实现类才做真正的实现,
而接口是限定到底实现什么东西和返回什么东西,三者之间分工明确、各负其责。
接口:
实现类:
工厂:。
Java中的设计模式和架构模式详解设计模式和架构模式是软件开发中非常重要的概念,它们可以帮助开发人员更好地设计和构建高质量的软件系统。
在Java中,设计模式和架构模式被广泛应用,许多经典的设计模式和架构模式都有对应的Java实现。
一、设计模式设计模式是针对软件设计中常见问题的解决方案的模板。
它们提供了一种通用的设计方法,可以帮助开发人员更好地组织和管理代码。
在Java中,最常用的设计模式包括:1.工厂模式(Factory Pattern):工厂模式是一种创建型设计模式,用于创建对象而不暴露创建逻辑。
它可以帮助我们将对象的创建和使用解耦,使系统更加灵活和可维护。
2.单例模式(Singleton Pattern):单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。
在Java中,单例模式通常通过私有化构造函数、静态变量和静态方法实现。
3.观察者模式(Observer Pattern):观察者模式是一种行为设计模式,用于实现对象之间的一对多依赖关系。
在Java中,观察者模式通常通过Java内置的Observer接口和Observable类实现。
4.策略模式(Strategy Pattern):策略模式是一种行为设计模式,用于定义一系列算法,并将每个算法封装起来,使它们可以互相替换。
在Java中,策略模式常常通过接口和实现类实现。
5.适配器模式(Adapter Pattern):适配器模式是一种结构设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。
在Java中,适配器模式通常通过接口实现或类继承实现。
以上只是部分常见的设计模式,在Java中还有许多其他设计模式,每种设计模式都有其特定的使用场景和优缺点,开发人员可以根据具体情况选择合适的设计模式来解决问题。
二、架构模式架构模式是指软件系统整体结构的模式,它可以指导系统的整体设计和组织。
在Java中,常见的架构模式包括:1.模型-视图-控制器模式(Model-View-Controller,MVC):MVC 是一种使用最广泛的架构模式,它将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,分别负责数据处理、用户界面和业务逻辑。
软件开发中常见的设计模式介绍在软件开发过程中,设计模式是一种被广泛应用的解决问题的方法。
设计模式可以提供在特定情境中重复使用的可行解决方案,有助于提高代码的可读性、可维护性和重用性。
本文将介绍几种常见的设计模式,包括工厂模式、观察者模式、单例模式和策略模式。
一、工厂模式工厂模式是一种常见的创建型设计模式,用于将对象的实例化过程封装起来。
它通过定义一个共同的接口来创建对象实例,使得客户端调用代码与具体的实现逻辑解耦。
工厂模式可以分为简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式通过一个工厂类来根据传入的参数决定创建哪个具体对象。
它的优点是实现简单,适用于对象类型较少且变化频率低的场景。
但是,当需要添加新的对象类型时,需要修改工厂类的代码,不符合开闭原则。
工厂方法模式通过定义一个抽象的工厂接口,由子类具体实现工厂方法来创建对象。
这种方式实现了对象的创建和使用的解耦,也符合开闭原则。
同时,工厂方法模式也可以在运行时动态地切换具体的子类工厂。
抽象工厂模式通过定义一个抽象的工厂接口,可以创建一组相关的对象。
它可以创建多个产品族的对象,且具有良好的扩展性。
但是,抽象工厂模式也增加了系统的复杂度和理解难度。
二、观察者模式观察者模式是一种常见的行为型设计模式,用于定义对象之间的一对多的依赖关系,使得当一个对象的状态发生变化时,其所依赖的对象都会得到通知并自动更新。
观察者模式分为被观察者和观察者两个角色。
被观察者维护一个观察者列表,并提供注册、移除和通知观察者的方法。
当被观察者的状态发生改变时,会遍历观察者列表,调用每个观察者的更新方法。
观察者接收到通知后,可以进行相应的处理。
观察者模式能够实现对象之间的松耦合,使得被观察者和观察者之间的依赖关系可以动态地建立和解除。
它也符合开闭原则,因为可以在运行时增加新的观察者。
三、单例模式单例模式是一种创建型设计模式,用于限制一个类只能创建一个实例。
它保证在整个应用程序中,只有一个实例存在,并提供了一个全局访问点。
1.1跟我学软件系统表示层的模块设计中所涉及的J2EE核心设计模式——服务/工人模式1.1.1服务/工人(Service to Worker)设计模式1、“服务/工人”设计模式它是由Dispatcher组件与Front Controller和View Helper模式组合而成的一种设计模式,先进行请求处理再进行视图处理,适合用于大型应用。
而其中的“Service”是指Dispatcher组件,而其中的“Worker”是指View Helper 组件。
2、类图和序列图(1)服务/工人模式的类图(2)服务/工人模式的序列图3、“服务/工人”设计模式中的Dispatcher组件(派遣器)在Service-to-Worker模式中控制器、派遣器的功能很大,除了要处理客户请求,视图跳转,派遣器还要从业务层读取数据,视图则主要负责数据的显示,从而简化视图(View)的设计。
4、实现的代码示例public class Controller extends HttpServlet{protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {//处理HTTP中的Get和Post的请求String next;try{// 利用View Helper组件收集参数和其它的信息RequestHelper helper = new RequestHelper(request, response);// 获得命令并利用command模式中的组件完成命令的处理和执行Command command = helper.getCommand();next = command.execute(helper);}catch (Exception e){}dispatch(request, response, next); //分发请求}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, java.io.IOException{processRequest(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, java.io.IOException {processRequest(request, response);}protected void dispatch(HttpServletRequest request, HttpServletResponse response,String page) throws javax.servlet.ServletException, java.io.IOException { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);dispatcher.forward(request, response);}}5、Dispatcher View与Service-to-Worker的对比由于Dispatcher View与Service-to-Worker有很多的相似之处,下面做一下比较与说明。
企业级软件开发的设计模式与架构企业级软件开发是一项复杂而庞大的任务,需要考虑到众多因素,如可扩展性、可维护性、安全性等。
为了满足这些需求,设计模式和架构成为了企业级软件开发中不可或缺的一部分。
本文将介绍一些常用的设计模式和架构,以及它们在企业级软件开发中的应用。
一、设计模式1. 单例模式单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。
在企业级软件开发中,单例模式常用于管理全局资源,如数据库连接池、日志系统等。
2. 工厂模式工厂模式是一种创建型设计模式,它通过一个工厂类来创建对象,而不需要直接调用构造函数。
在企业级软件开发中,工厂模式常用于隐藏对象的创建细节,提供统一的接口。
3. 观察者模式观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
在企业级软件开发中,观察者模式常用于事件驱动的系统中,如消息队列、发布订阅模式等。
4. 代理模式代理模式是一种结构型设计模式,它提供了一个代理对象来控制对原始对象的访问。
在企业级软件开发中,代理模式常用于实现安全控制、远程访问等功能。
二、架构1. 分层架构分层架构是一种常见的架构模式,它将系统分为若干层,每一层都有特定的职责。
在企业级软件开发中,分层架构常用于实现系统的松耦合和可维护性。
- 表现层:负责接收用户请求,展示数据给用户。
- 业务层:负责处理业务逻辑,协调各个子系统。
- 数据访问层:负责与数据库交互,提供数据访问接口。
2. 微服务架构微服务架构是一种将系统拆分为若干小型、独立部署的服务的架构模式。
每个服务都有自己的数据库和业务逻辑,通过API进行通信。
在企业级软件开发中,微服务架构常用于大型系统的开发,可以提高系统的可伸缩性和可维护性。
3. 事件驱动架构事件驱动架构是一种基于事件的异步架构模式,它通过事件的发布和订阅来实现不同组件之间的解耦。
工厂模式原理
工厂模式是一种创建型设计模式,用于创建对象的过程。
它将对象的创建细节封装在一个工厂类中,而不是在客户端直接实例化对象。
客户端只需要调用工厂类的方法来获取所需要的对象。
工厂模式包括三个主要组件:
1. 产品接口(Product Interface):定义产品的公共接口,所有具体产品类都必须实现这个接口。
2. 具体产品类(Concrete Product):实现产品接口,定义具体的产品。
3. 工厂类(Factory):负责创建具体产品对象的类。
它包含
一个或多个工厂方法,用于创建不同类型的产品对象。
这些方法通常使用简单工厂方法来创建对象,也可以使用其他创建对象的方式,如工厂方法模式或抽象工厂模式。
工厂模式的主要思想是将具体对象的创建与使用分离,客户端通过工厂类来创建对象,而不需要直接实例化具体的产品类。
这样可以使客户端与具体产品类解耦,使得系统更加灵活,易于扩展。
工厂模式的优点有:
1. 代码组织清晰,符合单一职责原则,每个类只负责一种职责。
2. 客户端与具体产品类解耦,易于替换具体产品类或新增产品类。
3. 强调了面向接口编程,降低了代码的耦合度。
工厂模式适用于以下情况:
1. 客户端不需要知道具体产品类的实现,只需要知道产品接口即可。
2. 客户端无法预知需要创建哪种类型的产品。
3. 系统需要动态地创建对象。
总之,工厂模式通过将对象的创建过程封装在工厂类中,使得客户端与具体产品类解耦,提供了一种灵活、可扩展的方式来创建对象。
它是一种常用的设计模式,被广泛应用于各种软件开发场景中。
1.1跟我学软件系统表示层的模块设计中所涉及的J2EE核心设计模式——责任链模式1.1.1责任链(Chain of Responsibility)模式1、什么是责任链模式(1)定义通过给一个以上对象处理请求的机会来避免请求的发送者和接收者的耦合---将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
因为这些类程序之间是一个松散的耦合,唯一的共同点是在他们之间传递请求。
也就是说,来了一个请求,A类的程序先处理,如果没有处理的话,就传递到B类程序来处理,如果还没有被处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。
责任链模式就是这种“推卸”责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象。
(2)主要的技术特点1)在责任链模式中,很多对象由每一个对象对其下家的对象的引用而接起来形成一条链。
请求在这个链上传递,直到链上的某一个对象决定处理此请求。
2)客户并不需要知道链上的哪一个对象最终处理了这个请求,系统可以在不影响客户端的情况下动态的重新组织该链和分配链上的节点程序类的责任(功能)。
2、责任链模式基本的要求责任链上的处理者程序可以有两个选择:承担责任(完成处理功能)或者把责任推给下家(不进行功能处理)。
注意:一个请求可能最终没有被责任链上的任何处理者进行处理。
3、为什么会产生责任链模式1)通常,对节点的链式判断都喜欢使用过程语法if...elseif...else或者更加形象化的switch-case语法。
2)但如果接收对象对于开发者来说是未知的,我们就无法将其过程化,还必须借助面向对象的强大的扩展能力。
3)最常见的应用就是Filter(过滤器),是责任链模式的一种应用。
4、责任链模式在本项目中的具体应用示例本项目中的各个过滤器采用责任链模式,从而实现将各个过滤器串接起来以实现多级过滤效果。
public interface Filter{public void doFilter(final ServletRequest request,final ServletResponse response,FilterChain chain)throws IOException,ServletException;}public class UserAccessFilter implements Filter{public void doFilter(final ServletRequest request,final ServletResponse response,FilterChain chain)throws IOException,ServletException{ // 主要的功能方法的实现chain.doFilter(request,response); //转向下一个过滤器}5、责任链模式的主要优缺点如果每个接收对象都需要处理请求的某一部分,就可以将不同的处理功能放在不同的对象里面,对单一处理的改动也非常方便。