设计模式18---设计模式之策略模式(Strategy)(行为型)
1.场景模拟
简单的报价管理系统:
对于普通用户和新用户报全价
对于老客户统一折扣5%
对于大客户统一折扣10%
2.不用模式的解决方案
package demo16.strategy.example2;
/*** 价格管理,主要完成计算向客户所报价格的功能*/
public class Price {/*** 报价,对不同类型的,计算不同的价格* @param goodsPrice 商品销售原价* @param customerType 客户类型* @return 计算出来的,应该给客户报的价格*/public double quote(double goodsPrice,String customerType){if("普通客户".equals(customerType)){return this.calcPriceForNormal(goodsPrice);}else if("老客户".equals(customerType)){return this.calcPriceForOld(goodsPrice);}else if("大客户".equals(customerType)){return this.calcPriceForLarge(goodsPrice); }//其余人员都是报原价return goodsPrice;}/*** 为新客户或者是普通客户计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/private double calcPriceForNormal(double goodsPrice){System.out.println("对于新客户或者是普通客户,没有折扣");return goodsPrice;}/*** 为老客户计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/private double calcPriceForOld(double goodsPrice){System.out.println("对于老客户,统一折扣5%");return goodsPrice*(1-0.05);}/*** 为大客户计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/private double calcPriceForLarge(double goodsPrice){System.out.println("对于大客户,统一折扣10%");return goodsPrice*(1-0.1); }
}
3.有何问题?
会经常有这样的需要,在公司周年庆的时候,所有的客户额外增加3%的折扣,在换季的时候普通用户额外增加3%的折扣,然后过了促销时间,价格又要涨回来,那么这个价格类将会非常的庞大,而且,方法非常的多。
看到这,朋友们很快就想到:如何实现才能让价格类中的计算报价的算法,很容易的实现可维护,可扩展,而且可以动态的切换变化呢?
4.使用策略模式来解决问题
4.1策略模式定义
定义一系列的算法,把他们一个个封装起来,并且可以使他们相互替换,本模式使得算法可独立于使用它的客户而变化。
4.2策略模式的结构图
4.3策略模式示例代码
package demo16.strategy.example3;/*** 策略,定义算法的接口*/
public interface Strategy {/*** 某个算法的接口,可以有传入参数,也可以有返回值*/public void algorithmInterface();
}
*********************************************************************
package demo16.strategy.example3;/*** 实现具体的算法*/
public class ConcreteStrategyA implements Strategy {public void algorithmInterface() {//具体的算法实现 }}
*********************************************************************
package demo16.strategy.example3;/*** 实现具体的算法*/
public class ConcreteStrategyB implements Strategy {public void algorithmInterface() {//具体的算法实现 }}package demo16.strategy.example3;/*** 实现具体的算法*/
public class ConcreteStrategyC implements Strategy {public void algorithmInterface() {//具体的算法实现 }
}
*********************************************************************
package demo16.strategy.example3;/*** 上下文对象,通常会持有一个具体的策略对象*/
public class Context {/*** 持有一个具体的策略对象*/private Strategy strategy;/*** 构造方法,传入一个具体的策略对象* @param aStrategy 具体的策略对象*/public Context(Strategy aStrategy) {this.strategy = aStrategy;}/*** 上下文对客户端提供的操作接口,可以有参数和返回值*/public void contextInterface() {//通常会转调具体的策略对象进行算法运算strategy.algorithmInterface();}
}
5.使用策略模式重写实例
package demo16.strategy.example4;/*** 策略,定义计算报价算法的接口*/
public interface Strategy {/*** 计算应报的价格* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/public double calcPrice(double goodsPrice);
}
************************************************************************
package demo16.strategy.example4;
/*** 具体算法实现,为新客户或者是普通客户计算应报的价格*/
public class NormalCustomerStrategy implements Strategy{public double calcPrice(double goodsPrice) {System.out.println("对于新客户或者是普通客户,没有折扣");return goodsPrice;}
}
***********************************************************************
package demo16.strategy.example4;
/*** 具体算法实现,为老客户计算应报的价格*/
public class OldCustomerStrategy implements Strategy{public double calcPrice(double goodsPrice) {System.out.println("对于老客户,统一折扣5%");return goodsPrice*(1-0.05);}
}
***********************************************************************
package demo16.strategy.example4;
/*** 具体算法实现,为大客户计算应报的价格*/
public class LargeCustomerStrategy implements Strategy{public double calcPrice(double goodsPrice) {System.out.println("对于大客户,统一折扣10%");return goodsPrice*(1-0.1);}
}
***********************************************************************
package demo16.strategy.example4;
/*** 价格管理,主要完成计算向客户所报价格的功能*/
public class Price {/*** 持有一个具体的策略对象*/private Strategy strategy = null;/*** 构造方法,传入一个具体的策略对象* @param aStrategy 具体的策略对象*/public Price(Strategy aStrategy){this.strategy = aStrategy;} /*** 报价,计算对客户的报价* @param goodsPrice 商品销售原价* @return 计算出来的,应该给客户报的价格*/public double quote(double goodsPrice){return this.strategy.calcPrice(goodsPrice);}
}
***********************************************************************
package demo16.strategy.example4;public class Client {public static void main(String[] args) {//1:选择并创建需要使用的策略对象Strategy strategy = new LargeCustomerStrategy();//2:创建上下文Price ctx = new Price(strategy);//3:计算报价double quote = ctx.quote(1000);System.out.println("向客户报价:"+quote);}
}
6.模式讲解
6.1要点
功能:把具体的算法从具体的业务处理中独立出来,把他们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。
策略算法是相同行为的不同实现
什么时候选用:多个if-else语句的时候就可以选用
6.2策略模式的调用顺序示意图
首先客户端选择并创建具体的策略对象
其次创建上下文
最后调用上下文的方法来执行功能了
6.3当添加新的策略时候
只需要动下面代码,是不是很简单,很方便呢?
//1:选择并创建需要使用的策略对象
Strategy strategy = new LargeCustomerStrategy();
6.4另一种策略模式调用示意图
6.5策略模式优缺点
优点:定义一系列算法,避免使用多重条件语句,更好的扩展性
缺点:客户端必须了解每种策略的不同,增加了对象数目,只适合扁平的算法结构(地位平等的算法)
6.6设计模式的本质
分离算法,选择实现
设计模式18---设计模式之策略模式(Strategy)(行为型)相关推荐
- Headfirst设计模式的C++实现——策略模式(Strategy)
前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h 1 #inc ...
- 解读设计模式----策略模式(Strategy Pattern)
一.模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同.其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法. 在我应 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
- 李建忠设计模式——策略模式Strategy
目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...
- 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)
在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了"工厂模式"."策略模式" ...
- 设计模式-策略模式(Strategy)-Java
设计模式-策略模式(Strategy)-Java 目录 文章目录 1.前言 2.示例案例-电影票打折方案 3.策略模式概述 3.1.策略模式定义 3.2.策略模式结构 3.3.策略模式结构图中角色 3 ...
- 8.6 GOF设计模式四: 策略模式… Strategy Pattern
策略模式- Strategy Pattern 在POS系统中,有时需要实行价格优惠, 该如何处理? 对普通客户或新客户报全价 对老客户统一折扣5% 对大客户统一折扣10% 注:课件 ...
- 二十四种设计模式:策略模式(Strategy Pattern)
策略模式(Strategy Pattern) 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操 ...
- 设计模式(二)--策略模式
1.策略模式 在策略模式中,我们可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封装算法的类我们都可以称之为一种策略(Strategy),为了保证这些策略在使用时具有一 ...
最新文章
- 成功解决ModuleNotFoundError: No module named 'dataset'
- jupyter notebook 删除指定kernel
- 百度智能云拿下MTCS最高安全评级,企业出海再添安全通道
- 科研福利!国内TOP3的超算中心,免费领2000核时计算资源
- java打字游戏代码_牛逼啊!一个随时随地写Python代码的神器
- cookie跨域_跨域问题的复现与整理
- $Django Paginator分页器 批量创建数据
- 83、冗余网关配置实验之VRRP
- 联想e470锁定计算机,thinkpad如何锁定键盘_联想thinkpad键盘锁怎么操作-win7之家
- 这就是艺术「GitHub 热点速览 v.22.25」
- 软件测试工程师工作必备模板五件套
- Markdown编辑器简单大概语法学习
- jquery固定table第一列或第一行
- 设计任务调度依赖配置表
- 3.APP推广有哪些渠道
- Dashboard Design 4.0(Xcelsius)数据直接绑定功能:瑕瑜互见
- 命令提示窗口输出汉字
- wordpress采集插件-wordpress关键词插件-wordpress百度推送插件-wordpress蜘蛛统计分析插件
- 计算机科学——计算机导论
- Django cms 教程六:集成博客/新闻模块
热门文章
- 分类算法——朴素贝叶斯分类
- 安卓Activity界面切换添加动画特效
- 数据结构之单链表尾插法创建-RearCreate
- 一起谈.NET技术,Visual Studio 2010 中的代码约定设置
- linux下实现作业调度程序,Linux后台作业
- tddebug怎么读取asm文件_如何利用 ASM 实现既有方法的增强?
- 玩转OpenVswitch:简介
- 洛谷 [P1801] 黑匣子
- jdbc-connect-oracle12c-pdb/cdb(jdbc连接oracle12c的pdb和cdb)
- WPF 根据绑定值设置DataGrid行背景色