欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Java设计模式25策略模式.pdf

    • 资源ID:69685658       资源大小:431.98KB        全文页数:31页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Java设计模式25策略模式.pdf

    第25章策略模式主讲教师:程细柱主讲教师:程细柱 韶关学院计算机系本书主编:刘韶关学院计算机系本书主编:刘 伟伟 清华大学出版社清华大学出版社本章教学内容?策略模式?模式动机与定义模式动机与定义?模式结构与分析模式结构与分析?模式实例与解析模式实例与解析?模式效果与应用模式效果与应用?模式扩展模式扩展策略模式?模式动机模式动机?完成一项任务完成一项任务,往往可以,往往可以有多种不同的方式有多种不同的方式,每一种方式称为一个策略每一种方式称为一个策略,我们,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务可以根据环境或者条件的不同选择不同的策略来完成该项任务。?在软件开发中在软件开发中也常常遇到类似的情况也常常遇到类似的情况,实现某一个功能有多个途径实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。策略模式?模式动机策略模式?模式动机模式动机?在软件系统中,有许多算法可以实现某一功能,如查找、排序等,在软件系统中,有许多算法可以实现某一功能,如查找、排序等,一种常用的方法一种常用的方法是是硬编码硬编码(Hard Coding)在一个类中,在一个类中,如如需要需要提供多种查找算法提供多种查找算法,可以将这些算法写到一个类中可以将这些算法写到一个类中,在该类中提供多个方法,在该类中提供多个方法,每一个方法对应一个具体的查找算法;每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过当然也可以将这些查找算法封装在一个统一的方法中,通过ifelse等条件判断语句来进行选择等条件判断语句来进行选择。这两种实现方法我们都可以称之为硬编码。这两种实现方法我们都可以称之为硬编码。?缺点是:缺点是:如果需要增加一种新的查找算法,需要修改封装算法类的源代码如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。策略模式?模式动机模式动机?除了提供专门的查找算法类之外,除了提供专门的查找算法类之外,还可以在客户端程序中直接包含算法代码还可以在客户端程序中直接包含算法代码,这种做法更不可取,这种做法更不可取,将导致客户端程序庞大而且难以维护将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。,如果存在大量可供选择的算法时问题将变得更加严重。?为了解决这些问题为了解决这些问题,可以定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法可以定义一些独立的类来封装不同的算法,每一个类封装一个具体的算法,在这里,在这里,每一个封装算法的类我们都可以称之为策略每一个封装算法的类我们都可以称之为策略(Strategy),为了保证这些策略的一致性,一般会用一个,为了保证这些策略的一致性,一般会用一个抽象的策略类来做算法的定义,而具体每种算法则对应于一个具体策略类抽象的策略类来做算法的定义,而具体每种算法则对应于一个具体策略类。策略模式?模式定义模式定义?策略模式策略模式(Strategy Pattern):定义一系列算法定义一系列算法,将每一个算法封装起来将每一个算法封装起来,并让它们,并让它们可以相互替换可以相互替换。策略模式让算法独立于使用它的客户而变化策略模式让算法独立于使用它的客户而变化,也称为,也称为政策模式政策模式(Policy)。策略模式是一种。策略模式是一种对象行为型对象行为型模式。模式。策略模式?模式定义模式定义?Strategy Pattern:Define a family of algorithms,encapsulate each one,and make them interchangeable.Strategy lets the algorithm vary independently from clients that use it.?Frequency of use:medium high策略模式?模式结构strategyContext-strategy:Strategy+algorithm()Strategyabstract+algorithm()ConcreteStrategyA+algorithm()ConcreteStrategyB+algorithm().strategy.algorithm();.策略模式?模式结构模式结构?策略模式包含如下角色:策略模式包含如下角色:Context:Context:环境类环境类 Strategy:Strategy:抽象策略类抽象策略类 ConcreteStrategy:ConcreteStrategy:具体策略类具体策略类策略模式?模式分析模式分析?策略模式是一个比较容易理解和使用的设计模式,策略模式是一个比较容易理解和使用的设计模式,策略模式策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常策略模式通常把一个系列的算法封装到一系列的策略类里面把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,准备一组算法,并将每一个算法封装起来,使得它们可以互换使得它们可以互换”。策略模式?模式分析模式分析?不使用策略模式的代码:不使用策略模式的代码:public class Context public void algorithm(String type).if(type=strategyA)/算法算法A else if(type=strategyB)/算法算法B else if(type=strategyC)/算法算法C .策略模式?模式分析?重构之后的重构之后的抽象策略类:抽象策略类:public abstract class AbstractStrategy public abstract void algorithm();策略模式?模式分析?重构之后的重构之后的具体策略类:具体策略类:public class ConcreteStrategyA extends AbstractStrategy public void algorithm()/算法算法A 策略模式?模式分析?重构之后的重构之后的环境类:环境类:public class Context private AbstractStrategy strategy;public void setStrategy(AbstractStrategy strategy)this.strategy=strategy;public void algorithm()strategy.algorithm();策略模式?模式分析?客户端代码片段:客户端代码片段:Context context=new Context();AbstractStrategy strategy;strategy=new ConcreteStrategyA();context.setStrategy(strategy);context.algorithm();策略模式?模式分析模式分析?在策略模式中,应当在策略模式中,应当由客户端自己决定由客户端自己决定在什么情况下在什么情况下使用什么具体策略角色使用什么具体策略角色。?策略模式仅仅封装算法,提供新算法插入到已有系统中策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中以及老算法从系统中“退休退休”的方便的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的,这也是策略模式的缺点之一缺点之一,在一定程度上增加了客户端的使用难度。,在一定程度上增加了客户端的使用难度。策略模式?策略模式实例与解析策略模式实例与解析?实例一:排序策略实例一:排序策略 某系统提供了一个用于对数组数据进行操作的类,该类封装了某系统提供了一个用于对数组数据进行操作的类,该类封装了对数组的常见操作对数组的常见操作,如查找数组元素、对数组元素进行排序等。现以排序操作为例,使用策略模式设计该数组操作类,使得客户端可以动态地更换排序算法,可以根据需要选择,如查找数组元素、对数组元素进行排序等。现以排序操作为例,使用策略模式设计该数组操作类,使得客户端可以动态地更换排序算法,可以根据需要选择冒泡排序冒泡排序或或选择排序选择排序或或插插入排序入排序,也能够灵活地增加新的排序算法。,也能够灵活地增加新的排序算法。策略模式?策略模式实例与解析?实例一:排序策略实例一:排序策略sortObjArrayHandler-sortObj:Sort+setSort(Sort sortObj)sort(int arr):void:intBubbleSort+sort(int arr):intInsertionSort+sort(int arr):intSort+sort(int arr):intSelectionSort+sort(int arr):int策略模式?策略模式实例与解析策略模式实例与解析?实例一:排序策略实例一:排序策略 参考代码:参考代码:Chapter 25 Strategysample01 下载地址:下载地址:http:/ 旅游出行方式可以有多种,如可以旅游出行方式可以有多种,如可以乘坐飞机旅游乘坐飞机旅游,也可以,也可以乘火车旅游乘火车旅游,如果有兴趣,如果有兴趣自行车游自行车游也是一种极具乐趣的出行方式。不同的旅游出行方式有不同的实现过程,客户根据自己的需要选择一种合适的旅游方式。在本实例中我们用策略模式来模拟这一过程。也是一种极具乐趣的出行方式。不同的旅游出行方式有不同的实现过程,客户根据自己的需要选择一种合适的旅游方式。在本实例中我们用策略模式来模拟这一过程。策略模式?策略模式实例与解析?实例二:旅游出行策略实例二:旅游出行策略 strategyPerson-strategy:TravelStrategy+setStrategy(TravelStrategy strategy)travel():void:voidAirplaneStrategy+travel():voidTrainStrategy+travel():voidTravelStrategy+travel():voidBicycleStrategy+travel():voidstrategy.travel();策略模式?模式优缺点模式优缺点?策略模式的优点策略模式的优点 策略模式提供了策略模式提供了对“开闭原则”的完美支持对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。策略模式策略模式提供了管理相关的算法族的办法提供了管理相关的算法族的办法。策略模式策略模式提供了可以替换继承关系的办法提供了可以替换继承关系的办法。使用策略模式可以使用策略模式可以避免使用多重条件转移语句避免使用多重条件转移语句。策略模式?模式优缺点模式优缺点?策略模式的缺点策略模式的缺点 客户端客户端必须知道所有的策略类必须知道所有的策略类,并自行决定使用哪一个策略类。,并自行决定使用哪一个策略类。策略模式策略模式将造成产生很多策略类将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。,可以通过使用享元模式在一定程度上减少对象的数量。策略模式?模式适用环境模式适用环境?在以下情况下可以使用策略模式:在以下情况下可以使用策略模式:如果在一个系统里面有许多类,如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。一个系统一个系统需要动态地在几种算法中选择一种需要动态地在几种算法中选择一种。如果如果一个对象有很多的行为一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句多重的条件选择语句来实现。来实现。不希望客户端知道复杂的、与算法相关的数据结构,不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。,提高算法的保密性与安全性。策略模式?模式应用?(1)Java SE的的容器布局管理容器布局管理就是策略模式应用的一个经典实例。就是策略模式应用的一个经典实例。ContainerFlowLayoutLayoutManagerGridLayoutBorderLayoutCardLayoutGridBagLayoutLayoutManager2JComponentJPanel策略模式?模式应用?(2)在微软公司提供的演示项目在微软公司提供的演示项目PetShop 4.0中PetShop 4.0中使用策略模式来处理使用策略模式来处理同步订单和异步订单同步订单和异步订单的问题。的问题。在Petshop 4.0的BLL子项目中有一个OrderAsynchronous类和一个OrderSynchronous类,它们都继承自IOrderStrategy。在Petshop 4.0的BLL子项目中有一个OrderAsynchronous类和一个OrderSynchronous类,它们都继承自IOrderStrategy。OrderSynchronousOrderSynchronous以一种以一种同步的方式处理订单同步的方式处理订单,而,而OrderAsynchronousOrderAsynchronous先将订单放在队列里,然后再对队列里的订单进行处理,以一种先将订单放在队列里,然后再对队列里的订单进行处理,以一种异步方式对订单进行处理异步方式对订单进行处理。而在BLL中的Order类里通过反射机制从配置文件中读取策略配置的信息以决定到底是使用哪种订单处理方式。只需要修改配置文件即可更改订单处理方式,提高了系统的灵活性。而在BLL中的Order类里通过反射机制从配置文件中读取策略配置的信息以决定到底是使用哪种订单处理方式。只需要修改配置文件即可更改订单处理方式,提高了系统的灵活性。策略模式?模式扩展模式扩展?策略模式策略模式与与状态模式状态模式 可以可以通过环境类状态的个数通过环境类状态的个数来来决定是使用策略模式还是状态模式决定是使用策略模式还是状态模式。策略模式策略模式的环境类自己选择一个具体策略类,具体策略类无须的环境类自己选择一个具体策略类,具体策略类无须关心环境类关心环境类;而;而状态模式状态模式的环境类由于外在因素需要放进一个的环境类由于外在因素需要放进一个具体状态中,以便通过其方法实现状态的切换,具体状态中,以便通过其方法实现状态的切换,因此因此环境类和状态类之间存在一种双向的关联关系。环境类和状态类之间存在一种双向的关联关系。使用使用策略模式策略模式时,时,客户端需要知道所选的具体策略是哪一个客户端需要知道所选的具体策略是哪一个,而使用,而使用状态模式状态模式时,时,客户端无须关心具体状态客户端无须关心具体状态,环境类的状态会根据用户的操作,环境类的状态会根据用户的操作自动转换自动转换。如果系统中某个类的对象存在多种状态,不同状态下行为有差异,而且这些如果系统中某个类的对象存在多种状态,不同状态下行为有差异,而且这些状态之间可以发生转换时使用状态之间可以发生转换时使用状态模式状态模式;如果系;如果系统中某个类的某一行为存在多种实现方式,而且统中某个类的某一行为存在多种实现方式,而且这些实现方式可以互换时使用这些实现方式可以互换时使用策略模式策略模式。本章小结?在策略模式中在策略模式中定义了一系列算法定义了一系列算法,将,将每一个算法封装起来每一个算法封装起来,并让它们,并让它们可以相互替换可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种对象行为型模式对象行为型模式。?策略模式策略模式包含三个角色:包含三个角色:环境类环境类在解决某个问题时可以采用多种策略,在环境类中维护一个对抽象策略类的引用实例;在解决某个问题时可以采用多种策略,在环境类中维护一个对抽象策略类的引用实例;抽象策略类抽象策略类为所支持的算法声明了抽象方法,是所有策略类的父类;为所支持的算法声明了抽象方法,是所有策略类的父类;具体策略类具体策略类实现了在抽象策略类中定义的算法。实现了在抽象策略类中定义的算法。?策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。本章小结?策略模式策略模式主要优点在于:主要优点在于:对对“开闭原则开闭原则”的完美支持,在不修改原有系统的基础上可以的完美支持,在不修改原有系统的基础上可以更换算法更换算法或者或者增加新的算法增加新的算法,它很好地管理算法族,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式;,它很好地管理算法族,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式;其缺点在于:其缺点在于:客户端必须知道所有的策略类,并理解其区别客户端必须知道所有的策略类,并理解其区别,同时在一定程度上,同时在一定程度上增加了系统中类的个数增加了系统中类的个数,可能会存在很多策略类。,可能会存在很多策略类。?策略模式适用情况包括:策略模式适用情况包括:在一个系统里面有许多类,它们之间的区别仅在于它们的行为在一个系统里面有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多行为中选择一种行为;,使用策略模式可以动态地让一个对象在许多行为中选择一种行为;一个系统需要动态地在几种算法中选择一种一个系统需要动态地在几种算法中选择一种,避免使用难以维护的多重条件选择语句,希望在具体策略类中封装算法和与相关的数据结构。,避免使用难以维护的多重条件选择语句,希望在具体策略类中封装算法和与相关的数据结构。ENDENDENDEND

    注意事项

    本文(Java设计模式25策略模式.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开