设计模式之策略模式与模板模式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

设计模式之策略模式主讲人:成玉丹时间:2016.11.14目录Contents1234定义和角色结构示意图示例代码实例说明5优缺点环境定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化。定义和角色结构示意图示例代码实例说明优缺点和环境角色(三种):策略接口:用来约束一系列具体的策略算法。策略实现:就是具体的算法实现。上下文:负责和具体的策略类交互,通常上下文会持有一个真正的策略实现。还可以让具体的策略类来获取上下文的数据,甚至让具体的策略类来获取上下文的数据。角色之间的关系:上下文使用策略接口来调用具体的策略实现定义的算法。定义和角色结构示意图示例代码实例说明优缺点和环境目录Contents1234定义和角色结构示意图示例代码实例说明5优缺点和环境策略实现(算法实现)定义和角色结构示意图示例代码实例说明优缺点和环境Context-strategy:Strategycreate+Context(aSteategy:Strategy)+contextInterface():voidinterfaceStrategy+algorithmInterface():voidContreteStrategyA+algorithmInterface():voidContreteStrategyB+algorithmInterface():voidContreteStrategyC+algorithmInterface():void目录Contents1234定义和角色结构示意图示例代码实例说明5优缺点和环境1、策略接口:定义算法的接口:/***策略:定义算法的接口*/publicinterfaceStrategy{/***某个算法的接口,可以有传入参数,也可以有返回值*/publicvoidalgorithmInterface();}调用具体的算法定义和角色结构示意图示例代码实例说明优缺点和环境2、策略实现:在具体的算法实现中,定义了三个,分别是ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC,示例非常简单,由于没有具体算法的实现,三者也就是名称不同,示例代码如下:/***实现具体的算法*/publicclassConcreteStrategyAimplementsStrategy{/***具体的算法实现*/publicvoidalgorithmInterface();}定义和角色结构示意图示例代码实例说明优缺点和环境3、上下文的实现:示例代码如下/***上下文对象,通常会持有一个具体的策略对象*/publicclassContext{/***持有一个具体的策略对象*/privateStrategystrategy;/***构造方法,传入一个具体的策略对象*@paramaStrategy具体的策略对象*/publicContext(StrategyaStrategy){this.strategy=aStrategy;}/***上下文对客户端的操作接口,可以有参数和返回值*/publicvoidcontextInterface(){//通常会转调具体的策略对象进行算法计算strategy.algorithmInterface();}}例如上文提到A,B,C三个对象定义和角色结构示意图示例代码实例说明优缺点和环境目录Contents1234定义和角色结构示意图示例代码实例说明5优缺点和环境实例:报价管理问题向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要报不同的价格,例如有新客户、老客户、大客户等。为了演示的简洁性,假定现在需要实现一个简化的报价管理,实现如下的功能:1)对普通客户或者是新客户报全价2)对老客户报的价格,统一折扣5%3)对大客户报的价格,统一折扣10%该怎么实现呢?定义和角色结构示意图示例代码实例说明优缺点和环境1、不用模式的解决方案:/***价格管理,主要完成向客户所报价格的功能*/publicclassPrice{/***报价对不同类型的客户计算不同的价格*@paramgoodsPrice商品销售原价*@paramcustomerType客户类型*@return计算出的应该给客户报的价格*/publicdoublequote(doublegoodsPrice,StringcustomerType){if(customerType.equals(普通客户)){System.out.println(对于普通客户或者是新客户,没有折扣);returngoodsPrice;}elseif(customerType.equals(老客户)){System.out.println(对于老客户,统一折扣5%);returngoodsPrice*(1-0.05);}elseif(customerType.equals(大客户)){System.out.println(对于大客户,统一折扣10%);returngoodsPrice*(1-0.1);}}//其余人员报原价returngoodsPrice;}这种解决方案存在的问题:价格类包含了所有计算报价的算法,使得价格类,尤其是报价这个方法比较庞杂,难以维护。定义了计算价格的算法定义和角色结构示意图示例代码实例说明优缺点和环境2、不用模式的修改方案:把这些算法从报价方法里面拿出去,形成独立的方法。据此写出如下的实现代码,示例代码如下:/***价格管理,主要完成向客户所报价格的功能*/publicclassPrice{/***报价对不同类型的客户计算不同的价格*@paramgoodsPrice商品销售原价*@paramcustomerType客户类型*@return计算出的应该给客户报的价格*/publicdoublequote(doublegoodsPrice,StringcustomerType){if(customerType.equals(普通客户)){returnthis.calcPriceForNomal(goodsPrice);}elseif(customerType.equals(老客户)){returnthis.calcPriceForOld(goodsPrice);}elseif(customerType.equals(大客户)){returnthis.calcPriceForLarge(goodsPrice);}}//其余人员报原价returngoodsPrice;}把算法从报价方法里拿出去,形成独立的方法,这里调用了算法定义和角色结构示意图示例代码实例说明优缺点和环境/***@paramgoodsPrice商品销售原价*@return计算出应报给客户的价格*///为新客户或者普通客户计算应报的价格privatedoublecalcForNomal(doublegoodsPrice){System.out.println(对于新客户或普通客户,没有折扣);returngoodsPrice;}//为老客户计算应报的价格privatedoublecalcForOld(doublegoodsPrice){System.out.println(对于老客户,统一折扣5%);returngoodsPrice*(1-0.05);}//为大客户计算应报的价格privatedoublecalcForLarge(doublegoodsPrice){System.out.println(对于大客户,统一折扣10%);returngoodsPrice*(1-0.1);}新客户和普通客户老客户大客户这样做的优点是:容易扩展,较好的维护。缺点是:如果有100种情况时,怎么做?定义和角色结构示意图示例代码实例说明优缺点和环境3、策略模式下的解决方案:要使用策略模式来重写前面报价的示例,大致有如下改变:首先需要定义出算法的接口。(策略接口)然后把各种报价的计算方式单独出来,形成算法类。(策略实现)对于Price这个类,把它当做上下文,在计算报价的时候,不再需要判断,直接使用持有的具体算法进行运算即可。选择使用哪一个算法的功能挪出去,放到外部使用的客户端去。(上下文)实例的结构图interfaceStrategy+calcprice(goodsPrice:double):doubleNormalCustomerStrategy+calcprice(goodsPrice:double):doubleOldCustomerStrategy+calcprice(goodsPrice:double):doubleLargeCustomerStrategy+calcprice(goodsPrice:double):doublePrice-strategy:Strategy=nullcreate+Price(aSteategy:Strategy)+quote(goodsPrice:double):double定义和角色结构示意图示例代码实例说明优缺点和环境先看策略接口,示例代码如下:/***策略,定义计算报价算法的接口*/publicinterfae{/***计算应报的价格*@paramgoodsPrice商品原售价*@return计算出应报给客户的价格*/publicdoublecalcPrice(doublegoodsPrice);}定义和角色结构示意图示例代码实例说明优缺点和环境接下来看看具体的算法实现,不同的算法,实现也不一样,先看为新客户或者是普通客户计算应报的价格的实现,示例代码如下:/***具体算法实现,为新客户或普通客户计算应报的价格*/publicclassNorMalCustomerStrategyimplementsStrategy{publicdoublecalcPrice(doublegoodsPrice){System.out.println(对于新客户或普通客户,没有折扣);returngoodsPrice;}}定义和角色结构示意图示例代码实例说明优缺点和环境老客户计算应报的价格的实现,示例代码如下:/***具体算法实现,为老客户计算应报的价格*/publicclassOldCustomerStrategyimplementsStrategy{publicdoublecalcPrice(doublegoodsPrice){System.out.println(对于老客户,统一折扣5%);returngoodsPrice*(1–0.05);}}定义和角色结构示意图示例代码实例说明优缺点和环境大客户计算应报的价格的实现,示例代码如下:/***具体算法实现,为大客户计算应报的价格*/publicclassLargeCustomerStrategyimplementsStrategy{publicdoublecalcPrice(doublegoodsPrice){System.out.println(对于大客户,统一折扣10%);returngoodsPrice*(1–0.1);}}定义和角色结构示意图示例代码实例说明优缺点和环境接下来看看上下文的实现,也就是原来的价格类,它的变化比较大,主要有:•原来那些私有的,用来做不同计算的方法,已经去掉了,独立出去做成了算法类•原来报价方法里面,对具体计算方式的判断,去掉了,让客户端来完成选择具体算法的功能•新添加持有一个具体的算法实现,通过构造方法传入•原来报价方法的实现,变化成了转调具体算法来实现定义和角色结构示意图示例代码实例说明优缺点和环境/***价格管理,主要完成计算向客户报价的功能*/publicclassPrice{/***持有一个具体的策略对象*/privateStrategystrategy=null;/***构造方法,传入一个具体的策略对象*@paramaStrategy具体的策略对象*/publicPrice(Strategystrate

1 / 45
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功