ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:69KB ,
资源ID:29826056      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29826056.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《JAVA设计模式》.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《JAVA设计模式》.docx

1、JAVA设计模式编号 计 算 机 工 程 学 院Java设计模式课程结题技术报告 课题名称:原型模式与策略模式的比较 学生姓名: 学 号: 专 业:计算机科学与技术 班 级:2014级2班 指导教师:2017年6月原型模式的原理与使用摘要:Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。策略模式定义了一系列算法,封装每个算法,并使它们互换。 策略使算法与使用它的客户端独立变化。关键词:原

2、型模式;策略模式;创建型设计模式;原理;应用Principle and use of prototype modelAbstract: Prototype prototype mode is a creative design pattern, Prototype mode allows an object to create another customizable object, there is no need to know any details of how to create, the working principle is: by passing a prototype ob

3、ject to the launch Create the object, the object to be created to create the object by requesting the prototype object to copy their own to implement the creation.The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm var

4、y independently from clients that use it.Key words: prototype model; creation design pattern; principle; application目录1前言 41.1 选题的目的和意义 42 概述、定义、结构和使用、优点和缺点 53 在Java中的应用 103.1 10原型模式: 103.2综合应用举例 11结束语 13参考文献 141前言1.1 选题的目的和意义全用此课题的目的是深入了解原型模式和策略模式的原理,能够应用原型模式或策略模式构架不同的应用程序。意义是通过对原型模式和策略模式的对比研究,掌握一种

5、研究方法,并推广到其他的模式研究中去,并锻炼出自主研究学习的能力,并加深对JAVA设计模式的理解与应用。2 概述、定义、结构和使用、优点和缺点2.1原型模式2.1.1原型模式概述在某些情况下,可能不希望反复使用类的构造方法创建许多对象,而是希望用该类型创建一个对象后,以该对象为原型得到该对象的若干个复制品。也就是说,将一个对象定义为原型对象,要求该原型对象提供一个方法,使该原型对象调用此方法可以复制一个和自己有完全相同状态的同类型对象,即该方法“克隆”原型对象得到一个新对象,这里使用“克隆”一词可能比复制一词更为形象,所以人们在复制对象时,也可经常等价说克隆对象。原型对象与以他为原型“克隆”出

6、的新对象可以分别独立的变化,也就是说,原型对象改变其状态不会影响到以它为原型所克隆的心对象,反之也是一样。比如,通过复制一个已有的Word文档中的文本创建一个新Word文档后,两个文档中的文本内容可独立的变化互不影响,也就是说,一个含有文本数据的原型对象改变其含有的文本数据不会影响以他为原型多克隆出的新对象中的文本内容。2.1.2原型模式的定义原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个对象的方法来创建更痛类型的对象。2.1.3原型模式的结构和使用原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创

7、建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。原型模式有两种表现形式:(1)简单形式、(2)登记形式,这两种表现形式仅仅是原型模式的不同实现。2.1.4原型模式的优点和缺点 (1)原型模式的优点当在创建对象成本太高的情况下(即初始化会占用较长时间,占用太多的cpu资源或网络资源),而这个对象又需要重复使用,这种情况下,新的对象可以通过原型模式对已有对象的属性进行复制并稍作修改来获得。(2)原型模式的缺点自己实现深层复制需要编写复杂的代码。2.1.5.适合使用原型模式的情景clone()方法将对象复制了一份并

8、返还给调用者。所谓“复制”的含义与clone()方法是怎么实现的。一般而言,clone()方法满足以下的描述:(1)对任何的对象x,都有:x.clone()!=x。换言之,克隆对象与原对象不是同一个对象。(2)对任何的对象x,都有:x.clone().getClass()=x.getClass(),换言之,克隆对象与原对象的类型一样。(3)如果对象x的equals()方法定义其恰当的话,那么x.clone().equals(x)应当成立的。在JAVA语言的API中,凡是提供了clone()方法的类,都满足上面的这些条件。JAVA语言的设计师在设计自己的clone()方法时,也应当遵守着三个条件

9、。一般来说,上面的三个条件中的前两个是必需的,而第三个是可选的。2.1.6、浅克隆和深克隆无论你是自己实现克隆方法,还是采用Java提供的克隆方法,都存在一个浅度克隆和深度克隆的问题。1、浅度克隆只负责克隆按值传递的数据(比如基本数据类型、String类型),而不复制它所引用的对象,换言之,所有的对其他对象的引用都仍然指向原来的对象。2、深度克隆除了浅度克隆要克隆的值外,还负责克隆引用类型的数据。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深度克隆把要复制的对象所引用的对象都复制了一遍,而这种对被引用到的对象的复制叫做间接复制。深度克隆要深入到多少层,

10、是一个不易确定的问题。在决定以深度克隆的方式复制一个对象的时候,必须决定对间接复制的对象时采取浅度克隆还是继续采用深度克隆。因此,在采取深度克隆时,需要决定多深才算深。此外,在深度克隆的过程中,很可能会出现循环引用的问题,必须小心处理。2.2策略模式2.2.1策略模式的定义 策略模式是一种行为模式。定义一系列的算法,把他们一个个封装起来,并且使他们可以相互替换,并对用户提供统一的接口,策略模式使算法可独立于使用它的客户而变化。(Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeable.Strategylets

11、thealgorithmvaryindependentlyfromclientsthatuseit.)策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。 策略模式的功能:把具体的算法实现从具体的业务处理中独立出来来,把它们实现成单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的可维护性和可扩展性策略算法在实现上也是相互独立的,相互之间相互没有依赖的。2.2.2策略模式的结构与使用 策略模式的结构图如上所示:Context定义了

12、一个面向应用的接口。它维护对一个Strategy对象的引用,并使用一个ConcreteStrategy对象来配置本身。Strategy定义所有的的算法的公共接口,Context使用此接口来调用具体的算法(策略)。具体算法在ConcreteStrategy中实现。这里每一种算法即为一个策略。当客户调用Context时,它将客户的请求转发给它的Strategy。Context将该算法所需的所有数据传递给Strategy,或者将自身作为参数传递给Strategy,使Strategy可以回调Context。ConcreteStrategy实现具体算法。 Strategy模式以以下几条原则为基础:(1)

13、对象都具有职责,这些职责不同的具体实现是通过多态的使用完成的。(2)概念上相同的算法具有多个不同的实现,需要进行管理。将问题域中的各个行为互相分离开来-也就是说将他们解耦,是一个好的设计实践,这使得我们可以修改负责某一行为的类,不会对其它的类产生不良影响trategy模式关键特征A.意图:可以根据所处的上下文,使用不同的的业务规则或算法;问题:对所需算法的选择取决于发出请求的客户或者要处理的数据,如果只有一些不会变化的算法,就不需要Strategy模式; B.解决方案:将对算法的选择和算法的实现相分离。允许根据上下文进行选择; C.参与者与写作者:Strategy模式制定了如何使用不同的算法,

14、各ConcreteStrategy实现了这些不同个算法,Context通过类型Strategy的引用时用具体的ConcreteStrategy,Strategy与Contextx相互作用以实现所选的算法,Context将均来自Context的请求转发给Strategy。 D.效果:Strategy模式定义了一些列的算法;可以不使用Switch语句或条件语句;必须以相同的方法调用所有的算法,(他们之间必须拥有相同的接口),各ConcreteStrategy与Context中加入获取状态的方法. E.实现:让使用算法的类(Context)包含一个抽象类(Strategy),该抽象类由一个抽象方法制

15、定如何让调用算法,每个派生类按需要实现算法。注意:在原型Strategy模式中,选择所有具体实现的职责由Context对象承担,并转给Strategy模式的Context对象3.4Strategy模式的组成环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。抽象策略类(Strategy):定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。具体策略类(ConcreteStrategy):Strategy接口实现某具体算法。2.2.

16、3策略模式的优缺点 1)相关算法系列Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。 2)提供了可以替换继承关系的办法:继承提供了另一种支持多种算法或行为的方法。你可以直接生成一个Context类的子类,从而给它以不同的行为。但这会将行为硬行编制到Context中,而将算法的实现与Context的实现混合起来,从而使Context难以理解、难以维护和难以扩展,而且还不能动态地改变算法。最后你得到一堆相关的类,它们之间的唯一差别是它们所使用的算法或行为。将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使

17、它易于切换、易于理解、易于扩展。 3)消除了一些ifelse条件语句:Strategy模式提供了用条件语句选择所需的行为以外的另一种选择。当不同的行为堆砌在一个类中时,很难避免使用条件语句来选择合适的行为。将行为封装在一个个独立的Strategy类中消除了这些条件语句。含有许多条件语句的代码通常意味着需要使用Strategy模式。 4)实现的选择Strategy模式可以提供相同行为的不同实现。客户可以根据不同时间/空间权衡取舍要求从不同策略中进行选择。3 在Java中的应用3.1原型模式:publicabstractclassAbstractSpoonimplementsCloneableSt

18、ringspoonName;publicvoidsetSpoonName(StringspoonName)this.spoonName=spoonName;publicStringgetSpoonName()returnthis.spoonName; publicObjectclone()Objectobject=null;try object=super.clone();catch(CloneNotSupportedExceptionexception)System.err.println(AbstractSpoonisnotCloneable);returnobject;策越模式:我们在一

19、家餐厅吃饭,针对套餐,不同年龄的人可能收费不一样,大人如父母40元每份,老人20元每份,小孩子10元每份。如果要设计个软件来做这件事,那么通常首先考虑的是使用ifelse或switch之类的结构来解决这个问题,例如如下代码:(代码不能运行,仅仅说明问题)publicclassClientpublicstaticvoidmain(Stringarg)showPrice(persontypeType); publicstaticvoidshowPrice(persontypepersontypeType) if(persontypeType.equals(daren)/大人System.out.p

20、rintln(每份40);else if(persontypeType.equals(laoren) /老人System.out.println(每份20);elseif(persontypeType.equals(xiaihai)/小孩子System.out.println(每份10);3.2综合应用举例代码如下:新建赛车的接口:Packagecar_interface;publicinterfacecar_interfacepublicvoidstart();publicvoidstop();新建奥迪汽车的实现类:packagecar_imple;importcar_fittings.ca

21、r_tyre;importcar_interface.car_interface;publicclassaudi_impleimplementscar_interface,Cloneableprivatecar_tyrecar_tyre_ref;publicvoidstart()System.out.println(奥迪A6启动了);publicvoidstop()System.out.println(奥迪A6停止了);publiccar_tyregetCar_tyre_ref()returncar_tyre_ref;publicvoidsetCar_tyre_ref(car_tyrecar_

22、tyre_ref)this.car_tyre_ref=car_tyre_ref;OverridepublicObjectclone()throwsCloneNotSupportedExceptionsuper.clone();audi_impleaudi_imple=newaudi_imple();audi_imple.setCar_tyre_ref(newcar_tyre();returnaudi_imple;新建奥迪汽车的配件轮胎类packagecar_fittings;publicclasscar_tyreprivateStringname=德国制造原版轮胎;publicStringge

23、tName()returnname;新建客户端运行类:packagerun_main;importcar_fittings.car_tyre;importcar_imple.audi_imple;importcar_interface.car_interface;publicclassrun_mainpublicstaticvoidmain(Stringargs)tryaudi_implecar_ref_my=newaudi_imple();car_ref_my.setCar_tyre_ref(newcar_tyre();System.out.println(我的奥迪车的参数是:+car_re

24、f_my);System.out.println(我的奥迪车的轮胎参数是:+car_ref_my.getCar_tyre_ref();audi_implecar_ref_other=(audi_imple)car_ref_my.clone();System.out.println(其它人的奥迪车的参数是:+car_ref_other);System.out.println(其它人的奥迪车的轮胎参数是:+car_ref_other.getCar_tyre_ref();catch(CloneNotSupportedExceptione)/TODOAuto-generatedcatchblocke.

25、printStackTrace();程序运行结果如下:我的奥迪车的参数是:car_imple.audi_imple9cab16我的奥迪车的轮胎参数是:car_fittings.car_tyre1a46e30其它人的奥迪车的参数是:car_imple.audi_imple3e25a5从打印的结果来看,我的汽车我的轮胎和其它人的汽车和轮胎都是不一样的对象,但“类型”都是一样的:奥迪的汽车,原版的轮胎。本例中也实现了“原型模式”中的“深拷贝/深复制”,即汽车类中有一个对象“轮胎”对象,关于深拷贝/深复制的概念请参考其它的资料。原型模式通常都是在复制对象的时候使用,而在常规的情况下都是使用new重新创

26、建一个,并且重新对属性进行复制,代码重复度很高,原型模式的出现避免了new的硬操作。结束语通过本次研究,学习了JAVA设计模式“原型模式”和“策略模式”,并通过对原形模式和策略模式的研究和学习,发现了一种JAVA设计模式的研究方法,即“概念-原理-应用”的研究学习方法。在原形模式的学习中,理解了Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。并通过实例奥迪车的轮胎型号,对原型模式的应用进行了尝试,对接下来其他模式的应用提供了经验。接下来我将逐步深入学习JAVA设计模式的其他模型,更好的掌握JAVA程序的编写。参考文献1沈琦,张虹多媒体数据库模型与存储模型研究J计算机工程1997,23(6)2钟玉琢,沈洪,吕小星等多媒体技术及应用其应用M北京:机械工业出版社20033XX百科 4谷歌翻译

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1