设计模式之策略模式课件(PPT 45张)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<interface> Strategy +algorithmInterface():void
ContreteStrategyB +algorithmInterface():void
ContreteStrategyC +algorithmInterface():void
策略实现(算法实现)
目
录
1 2 3 4 5
定义和角色
结构示意图 示例代码 实例说明 优缺点和环境
/** *上下文对客户端的操作接口,可以有参数和返回值 */ public void contextInterface(){ //通常会转调具体的策略对象进行算法计算 strategy.algorithmInterface(); } }
例如上文提到A,B,C 三个对象
定义和角色
结构示意图 示例代码 实例说明 优缺点和环境
角色(三种):
策略接口:用来约束一系列具体的策略算法。 策略实现:就是具体的算法实现。 上下文:负责和具体的策略类交互,通常上下文会持有一 个真正的策略实现。还可以让具体的策略类来获取上下文的数 据,甚至让具体的策略类来获取上下文的数据。
角色之间的关系:上下文使用策略接口来调用具体的策略 实现定义的算法。
2)对老客户报的价格,统一折扣5%
3)对大客户报的价格,统一折扣10% 该怎么实现呢?
1、不用模式的解决方案:
定义和角色
结构示意图 示例代码 实例说明 优缺点和环境
/** *价格管理,主要完成向客户所报价格的功能 */ public class Price{ /** *报价对不同类型的客户计算不同的价格 *@param goodsPrice 商品销售原价 *@param customerType 客户类型 *@return 计算出的应该给客户报的价格 */
定义了计算价格 的算法
public double quote(double goodsPrice, String customerType){ if(customerType.equals("普通客户")){ System.out.println("对于普通客户或者是新客户,没有折扣"); return goodsPrice; }else if(customerType.equals("老客户")){ System.out.println("对于老客户,统一折扣 5%"); return goodsPrice * (1 - 0.05); }else if(customerType.equals("大客户")){ System.out.println("对于大客户,统一折扣 10%"); return goodsPrice * (1 - 0.1); } } 这种解决方案存在的问题:价格类包含了 //其余人员报原价 所有计算报价的算法,使得价格类,尤其 return goodsPrice; }
目
录
1 2 3 4 5
• Contents
定义和角色
结构示意图
示例代码 实例说明 优缺点和环境
定义和角色
结构示意图 示例代码 实例说明 优缺点和环境
ContreteStrategyA +algorithmInterface():void
Context
-strategy:Strategy <create> +Context(aSteategy:Strategy) +contextInterface():void
public void algorithmInterface(); }Baidu Nhomakorabea
调用具体的算法
定义和角色
结构示意图 示例代码 实例说明 优缺点和环境
2、策略实现:在具体的算法实现中,定义了三个,分别 是ConcreteStrategyA、ConcreteStrategyB、 ConcreteStrategyC ,示例非常简单,由于没有具体算法 的实现,三者也就是名称不同,示例代码如下:
/** *实现具体的算法 */
public class ConcreteStrategyA implements Strategy{ /** *具体的算法实现 */
public void algorithmInterface(); }
3、上下文的实现:示例代码如下
/** *上下文对象,通常会持有一个具体的策略对象 */ public class Context{ /** *持有一个具体的策略对象 */ private Strategy strategy; /** *构造方法,传入一个具体的策略对象 *@param aStrategy 具体的策略对象 */ public Context(Strategy aStrategy){ this.strategy = aStrategy; }
是报价这个方法比较庞杂,难以维护。
2、不用模式的修改方案:
把这些算法从报价方法里面拿出去,形成独立的方法。据 此写出如下的实现代码,示例代码如下:
设计模式之策略模式
主讲人 :成 玉 丹 间:2016.11.14
时
目
录
1
定义和角色 结构示意图 示例代码
实例说明
• Contents
2 3 4 5
优缺点环境
定义和角色
结构示意图 示例代码 实例说明 优缺点和环境
定义:
策略模式定义了一系列的算法,并将每一个
算法封装起来,而且使它们还可以互相替换。策 略模式让算法独立于使用它的客户而独立变化。
• Contents
定义和角色
结构示意图
示例代码 实例说明
优缺点和环境
1、策略接口:定义算法的接口:
定义和角色
结构示意图 示例代码 实例说明 优缺点和环境
/** *策略:定义算法的接口 */
public interface Strategy{ /** *某个算法的接口,可以有传入参数,也可以有返回值 */
目
录
1 2 3 4 5
• Contents
定义和角色
结构示意图
示例代码 实例说明 优缺点和环境
实例:报价管理问题
定义和角色
向客户报价,对于销售部门的人来讲,这是一个非常重
结构示意图 示例代码 实例说明 优缺点和环境
大、非常复杂的问题,对不同的客户要报不同的价格,例如 有新客户、老客户、大客户等。 为了演示的简洁性,假定现在需要实现一个简化的报价 管理,实现如下的功能: 1)对普通客户或者是新客户报全价