设计模式报告.docx
《设计模式报告.docx》由会员分享,可在线阅读,更多相关《设计模式报告.docx(23页珍藏版)》请在冰点文库上搜索。
![设计模式报告.docx](https://file1.bingdoc.com/fileroot1/2023-4/30/2ffbdbd7-5c83-4613-8462-ad0eff6e671f/2ffbdbd7-5c83-4613-8462-ad0eff6e671f1.gif)
课程设计说明书
课程名称设计模式课程设计
设计题目设计模式在FileUpload组件中的应用
班号专业软件工程
学生姓名######
指导教师(签字)
目录
第一章设计模式概述
1.1模式与设计模式
1.2设计模式的定义
1.3设计模式的基本要素
1.4设计模式的分类
第二章FileUpload组件简介
2.1FileUpload组件由来及使用
2.2FileUpload组件的工作原理
2.3FileUpload组件中的部分接口、类简介
第三章设计模式在FileUpload组件中的应用
3.1工厂方法模式在FileUpload组件中的应用
3.2策略模式在FileUpload组建中的应用
3.3迭代器模式在FileUpload组建中的应用
3.4FileUpload组件中的重要类图
第四章结束语
4.1收获与总结
4.2参考文献
第一章设计模式概述
1.1模式与设计模式
模式起源于建筑业而非软件业,模式(Pattern)之父—美国加利佛尼亚大学环境结构中心研究所所长ChristopherAlexander博士。
Alexander给出了关于模式的经典定义:
每个模式都描述了我们环境中不断出现的问题,然后描述了解决这个问题解决方案的核心,通过这种方式,我们可以无数次的重用那些已有的解决方案,无需再重复相同的工作,也可以用一句话概括为:
模式是在特定环境中解决问题的一种方案。
最早将Alexander博士的模式思想引入软件工程方法学的是以四人组(GangofFour,GoF)自称的四位著名软件工程学者,他们在1949归纳发表的23中在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法学在分析、设计和实现间的鸿沟。
GoF将模式的概念引入软件工程领域,标志着软件模式的诞生,软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思想或参照样板软件模式并非仅限于设计模式,还包括架构模式、分析模式、和过程模式等。
从1987年KentBeck和WardCunningham借鉴Alexander的模式思想在程序开发中开始应用一些模式到目前设计模式在软件开发的广泛应用,Sun公司的JavaSE/JavaEE平台和Microsoft公司的.net平台设计中就应用了大量的设计模式。
再设计模式领域,下一的设计模式是指GoF的《设计模式:
可复用面向对象软件的基础》一书中包含的23中经典设计模式,不过设计模式并不仅仅只有这23中,随着软件开发技术的发展,越来越多的模式不断诞生并得以广泛应用。
1.2设计模式的定义
设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。
1.3设计模式的基本要素
1.3.1模式名称(Patternname)
模式名称通过一两个词来描述模式的问题、解决方案和效果,以便更好地理解模式并方便开发人员之间的交流,绝大多数模式都是根据其功能或模式结构来命名的。
1.3.2问题(Problem)
问题描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因。
这些问题有些是一些特定的设计问题,如怎样使用对象封装状态或者使用对象表示算法等,也可能是系统中存在不灵活的类或对象结构,导致系统可维护性较差。
1.3.3解决方案(Solution)
解决方案描述了设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式。
模式是一个通用的模板,它们可以应用于各种不同的场合,解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
1.3.4效果(Consequences)
效果描述了模式应用的效果以及在使用模式时应权衡的问题。
效果主要包含模式的优缺点分析,我们应该知道,没有任何一个解决方案是百分之百完美的,在使用设计模式时需要进行合理的评价和选择。
1.4设计模式的分类
根据设计模式的目的(模式是用来做什么的)可分为创建型(creational)、结构型(structural)和行为型(behavioral)三种。
以下是GoF的23中经典模式的分类。
第二章FileUpload组件简介
2.1.FileUpload组件由来及使用
FileUpload是Apachecommons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的Smartypants齐名。
需要注意的是FileUpload组件在使用时依赖于CommonsIO组件,因此在继续之前,要确保在你的工程classpath中有描述页中提到的相应版本,本次课程实际使用的FileUpload版本为:
commons-fileupload-1.3.1,CommonsIO版本为:
commons-io-1.4。
2.2.FileUpload组件的工作原理
上传的文件要求包括一个根据RFC1867(在HTML中基于表单的文件)编码的选项列表清单。
组件FileUpload可以解析这个请求,并给你的应用程序提供一份独立上传的项目清单。
无论每个项目背后如何执行都实现了FileItem接口。
这里将描述组件FileUpload库的普通API,这些API比较简单。
不过,对于最终的实现,你可以参考最新的API流。
每一个文件项目都有一些属性,这些可能在你的应用程序中应用到。
比如:
每一个项目有一个名称name和内容类型contenttype,并提供了一个InputStream访问其数据。
另一方面,你处理项目的方法可能有所不同,这个依赖于是否这个项目是一个规则的表单域,即:
这个数据是来自普通的表单文本,还是普通的HTML域或是一个上传文件。
在FileItem接口中提供了处理这些问题的方法,可以更加方便的去访问这些数据。
组件FileUpload使用FileItemFactory工厂创建新的文件项目。
这个给了组件FileUpload很大的灵活性。
这个工厂拥有怎样创建项目的最终控制权。
工厂执行过程中上传项目文件的临时数据可以存储在内存中或硬盘上。
这个依赖于上传项目的大小(即:
数据的字节)。
不过这种行为可以在你的应用程序中适当的自定制。
2.3FileUpload组件中部分接口、类简介
2.3.1FileItem接口
mons.fileupload.disk.DiskFileItem实现了FileItem接口,用来封装单个表单字段元素的数据。
通过调用FileItem定义的方法可以获得相关表单字段元素的数据。
2.3.2FileUpload类
FileUpload类的继承结构:
java.lang.Object
mons.fileupload.FileUploadBase
mons.fileupload.FileUpload
2.3.3DiskFileItemFactory
此类将请求消息实体中的每一个项目封装成单独的DiskFileItem(FileItem接口的实现)对象的任务由mons.fileupload.FileItemFactory接口的默认实现mons.fileupload.disk.DiskFileItemFactory来完成。
当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。
2.3.4ServletFileUpload类
mons.fileupload.servlet.ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不需要管底层实现,暴露给用户的简单易用的接口)。
使用其parseRequest(HttpServletRequest)方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。
第三章设计模式在FileUpload组件中的应用
3.1工厂方法模式在FileUpload组件中的应用
3.1.1工厂方法模式定义
工厂方法模式(FactoryMethodPattern)定义:
工厂方法模式又称为工厂模式,也叫虚拟构造器(VirtualConstructor)模式或者多态工厂(PolymorphicFactory)模式,它属于类创建型模式。
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
3.1.2工厂方法模式结构
1.Product(抽象产品)
抽象产品是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的共同父类或接口。
2.ConcreteProduct(具体产品)
具体产品实现了抽象产品接口,某种类型的具体产一一对应。
3.Factory(抽象工厂)
在抽象工厂类中,声明了工厂方法(FactoryMethod)厂方法模式的核心,它与应用程序无关。
任何在模式中创建对象的工厂类都必须实现该接口。
4.ConcreteFactory(具体工厂)
具体工厂是抽象工厂类的子类,实现了抽象工厂中返回一个具体产品类的实例。
在具体工厂类中包含与应用程序调用以创建产品对象。
3.1.3模式分析
工厂方法模式是简单工厂模式的进一步抽象和推广。
工厂方法模式保持了简单工厂模式的优点,而且克服了的工厂类不再负责所有产品的创建,而是将具体创建工负责给出具体工厂必须实现的接口,而不负责哪一个产方法模式可以允许系统在不修改工厂角色的情况下引进类与产品类往往具有平行的等级结构,它们之间一一对应。
通过分析,该组件中应用了工厂方法模式的类如下:
FileItemFactory类(抽象工厂):
是工厂方法的核心,它与应用程序无关。
包含了抽象的工厂方法:
FileItemcreateItem(
StringfieldName,
StringcontentType,
booleanisFormField,
StringfileName
);
返回一个抽象产品FileItem对象。
DiskFileItemFactory类(具体工厂):
实现了抽象工厂方法FileItemcreateItem(),在工厂方法中创建并返回一个对象的具体产品。
publicFileItemcreateItem(StringfieldName,StringcontentType,
booleanisFormField,StringfileName){
DiskFileItemresult=newDiskFileItem(fieldName,contentType,
isFormField,fileName,sizeThreshold,repository);
FileCleaningTrackertracker=getFileCleaningTracker();
if(tracker!
=null){
tracker.track(result.getTempFile(),result);
}
returnresult;
}
FileItem类(抽象产品),是一个接口,其中包含了产品类所具有的所有的业务方法。
InputStreamgetInputStream()throwsIOException;
StringgetContentType();
StringgetName();
booleanisInMemory();
longgetSize();
byte[]get();
StringgetString(Stringencoding)throwsUnsupportedEncodingException;
StringgetString();
voidwrite(Filefile)throwsException;
voiddelete();
StringgetFieldName();
voidsetFieldName(Stringname);
booleanisFormField();
voidsetFormField(booleanstate);
OutputStreamgetOutputStream()throwsIOException;
DiskFileItem类(具体产品类):
是抽象产品FileItem接口的子类,实现了FileItem接口中所有的业务方法,以下就其中的部分方法的实现做介绍:
publicInputStreamgetInputStream()
throwsIOException{
if(!
isInMemory()){
returnnewFileInputStream(dfos.getFile());
}
if(cachedContent==null){
cachedContent=dfos.getData();
}
returnnewByteArrayInputStream(cachedContent);
}
3.2策略模式在FileUpload组建中的应用
3.2.1策略模式定义
策略模式(StrategyPattern)定义:
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)策略模式是一种对象行为型模式。
3.2.2策略模式结构图
3.2.2.1Context(环境类)
环境类是使用算法的角色,它在解决某个问题时可以采用多种策略。
在环境类中维护一个对抽象策略类的引用实例,用于定义所采用的策略。
3.2.2.2Strategy(抽象策略类)
抽象策略类为所支持的算法申明了抽象方法,是所有策略类的父类,他可以是抽象类也可以是接口。
环境类使用在其中声明的方法调用在具体策略类中实现的算法。
3.2.2.3concretStrategy(具体策略类)具体策略类实现了在抽象策略中定义的算法,在运行时,具体策略类将覆盖在环境泪中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。
3.2.3策略模式分析
策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。
策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。
用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
3.2.4策略模式在FileUpload组件中的分析
类图如下:
FileUpload类(环境类)
publicclassFileUploadextendsFileUploadBase{
privateFileItemFactoryfileItemFactory;
publicFileUpload(){
super();
}
publicFileUpload(FileItemFactoryfileItemFactory){
super();
this.fileItemFactory=fileItemFactory;
}
publicFileItemFactorygetFileItemFactory(){
returnfileItemFactory;
}
publicvoidsetFileItemFactory(FileItemFactoryfactory){
this.fileItemFactory=factory;
}
}FileUpload类是环境类,他定义并维持了对抽象策略类的一个引用,通过其方法privateFileItemFactoryfileItemFactory;可以在运行时设置一种具体策略,并在其算法下调用策略类提供的算法完成相应的业务处理。
FileItemFactory类(抽象策略类)
publicinterfaceFileItemFactory{
FileItemcreateItem(
StringfieldName,
StringcontentType,
booleanisFormField,
StringfileName
);
}
FileItemFactory作为抽象策略类,它定义了算法的抽象定义,而在其子类DiskFileItemFactory类中实现了具体算法。
DiskFileItemFactory类(具体策略类)
publicclassDiskFileItemFactoryimplementsFileItemFactory{
publicstaticfinalintDEFAULT_SIZE_THRESHOLD=10240;
privateFilerepository;
privateintsizeThreshold=DEFAULT_SIZE_THRESHOLD;
privateFileCleaningTrackerfileCleaningTracker;
publicDiskFileItemFactory(){
this(DEFAULT_SIZE_THRESHOLD,null);
}
publicDiskFileItemFactory(intsizeThreshold,Filerepository){
this.sizeThreshold=sizeThreshold;
this.repository=repository;
}
publicFilegetRepository(){
returnrepository;
}
publicvoidsetRepository(Filerepository){
this.repository=repository;
}
publicintgetSizeThreshold(){
returnsizeThreshold;
}
publicvoidsetSizeThreshold(intsizeThreshold){
this.sizeThreshold=sizeThreshold;}
publicFileItemcreateItem(StringfieldName,StringcontentType,
booleanisFormField,StringfileName){
DiskFileItemresult=newDiskFileItem(fieldName,contentType,
isFormField,fileName,sizeThreshold,repository);
FileCleaningTrackertracker=getFileCleaningTracker();
if(tracker!
=null){
tracker.track(result.getTempFile(),result);}
returnresult;}
publicFileCleaningTrackergetFileCleaningTracker(){
returnfileCleaningTracker;}
publicvoidsetFileCleaningTracker(FileCleaningTrackerpTracker){
fileCleaningTracker=pTracker;}
}
DiskFileItemFactory类作为FileItemFactory类的子类,是一种具体策略类,实现了抽象策略类中的方法。
3.3迭代器模式在FileUpload组建中的应用
3.3.1迭代器模式定义
迭代器模式(Iteratorpattern)定义:
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。
迭代器模式是一种对象行为型模式。
3.3.2迭代器模式结构
迭代器模式包含如下角色:
1.Iterator(抽象迭代器)
抽象迭代器定义了访问和遍历元素的接口,一般声明如下方法:
用于获取第一个元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的。
urrentltemO,在其子类中将实现这些方法。
2.Concretelterator(具体迭代器)
具体迭代器实现了抽象迭代器接口,完成对聚合对象的遍历,同时在对聚合进行遍历时跟踪其当前位置。
3.Aggregate(抽象聚合类)
抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口,声明一个createIterator()方法用于创建一个迭代器对象。
4.ConcreteAggregate(具体聚合类)
具体聚合类实现了创建相应迭代器的接口,实现了在聚合类中声明的createltera