首页 研磨设计模式之 策略模式-1

研磨设计模式之 策略模式-1

举报
开通vip

研磨设计模式之 策略模式-1研磨设计模式之 策略模式-1 首先感谢众多朋友的支持、评论和鼓励,只有多多努力,写点好的博文来回报大家的好意~ 接下来想写写另外一个虽然较简单,但是使用很频繁的模式——策略模式 策略模式(Strategy) 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要报不同的价格,比如: (1)对普通客户或者是新客户报的是全价 (2)对老客户报的价格,根据客户年限,给予一定的折扣 (3)对大客户报的价格,根据大客户的累计消费金额,给予一定的折扣...

研磨设计模式之 策略模式-1
研磨设计模式之 策略模式-1 首先感谢众多朋友的支持、评论和鼓励,只有多多努力,写点好的博文来回报大家的好意~ 接下来想写写另外一个虽然较简单,但是使用很频繁的模式——策略模式 策略模式(Strategy) 1 场景问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要报不同的价格,比如: (1)对普通客户或者是新客户报的是全价 (2)对老客户报的价格,根据客户年限,给予一定的折扣 (3)对大客户报的价格,根据大客户的累计消费金额,给予一定的折扣 (4)还要考虑客户购买的数量和金额,比如:虽然是新用户,但是一次购买的数量非常大,或者是总金额非常高,也会有一定的折扣 (5)还有,报价人员的职务高低,也决定了他是否有权限对价格进行一定的浮动折扣 甚至在不同的阶段,对客户的报价也不同,一般情况是刚开始比较高,越接近成交阶段,报价越趋于合理。 总之,向客户报价是非常复杂的,因此在一些CRM(客户关系管理)的系统中,会有一个单独的报价管理模块,来处理复杂的报价功能。 为了演示的简洁性,假定现在需要实现一个简化的报价管理,实现如下的功能: (1)对普通客户或者是新客户报全价 (2)对老客户报的价格,统一折扣5% (3)对大客户报的价格,统一折扣10% 该怎么实现呢, 1.2 不用模式的解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 要实现对不同的人员报不同的价格的功能,无外乎就是判断起来麻烦点,也不多难,很快就有朋友能写出如下的实现代码,示例代码如下: /** * 价格管理,主要完成计算向客户所报价格的功能 */ 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..println("对于老客户,统一折扣5%"); out return goodsPrice*(1-0.05); }else if(customerType.equals("大客户")){ out.println("对于大客户,统一折扣10%"); System. return goodsPrice*(1-0.1); } //其余人员都是报原价 return goodsPrice; } } 1.3 有何问题 上面的写法是很简单的,也很容易想,但是仔细想想,这样实现,问题可不小,比如: (1)第一个问题:价格类包含了所有计算报价的算法,使得价格类,尤其是报价这个方法比较庞杂,难以维护。 有朋友可能会想,这很简单嘛,把这些算法从报价方法里面拿出去,形成独立的方法不就可以解决这个问题了吗,据此写出如下的实现代码,示例代码如下: /** * 价格管理,主要完成计算向客户所报价格的功能 */ public class Price { /** * 报价,对不同类型的,计算不同的价格 * @param goodsPrice 商品销售原价 * @param customerType 客户类型 * @return 计算出来的,应该给客户报的价格 */ public double quote(double goodsPrice,String customerType){ if(customerType.equals("普通客户")){ return this.calcPriceForNormal(goodsPrice); }else if(customerType.equals("老客户")){ return this.calcPriceForOld(goodsPrice); }else if(customerType.equals("大客户")){ 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){ out.println("对于老客户,统一折扣5%"); System. return goodsPrice*(1-0.05); } /** * 为大客户计算应报的价格 * @param goodsPrice 商品销售原价 * @return 计算出来的,应该给客户报的价格 */ private double calcPriceForLarge(double goodsPrice){ System.out.println("对于大客户,统一折扣10%"); return goodsPrice*(1-0.1); } } 这样看起来,比刚开始稍稍好点,计算报价的方法会稍稍简单一点,这样维护起来也稍好一些,某个算法发生了变化,直接修改相应的私有方法就可以了。扩展起来也容易一点,比如要增加一个“战略合作客户”的类型,报价为直接8折,就只需要在价格类里面新增加一个私有的方法来计算新的价格,然后在计算报价的方法里面新添一个else-if即可。看起来似乎很不错了。 真的很不错了吗, 再想想,问题还是存在,只不过从计算报价的方法挪动到价格类里面了,假如有100个或者更多这样的计算方式,这会让这个价格类非常庞大,难以维护。而且,维护和扩展都需要去修改已有的代码,这是很不好的,违反了开-闭原则。 (2)第二个问题:经常会有这样的需要,在不同的时候,要使用不同的计算方式。 比如:在公司周年庆的时候,所有的客户额外增加3%的折扣;在换季促销的时候,普通客户是额外增加折扣2%,老客户是额外增加折扣3%,大客户是额外增加折扣5%。这意味着计算报价的方式会经常被修改,或者被切换。 通常情况下应该是被切换,因为过了促销时间,又还回到正常的价格体系上来了。而现在的价格类中计算报价的方法,是固定调用各种计算方式,这使得切换调用不同的计算方式很麻烦,每次都需要修改if-else里面的调用代码。 看到这里,可能有朋友会想,那么到底应该如何实现,才能够让价格类中的计算报价的算法,能很容易的实现可维护、可扩展,又能动态的切换变化呢, 未完待续...... Tag标签: 设计模式,Java,设计,策略模式
本文档为【研磨设计模式之 策略模式-1】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_574951
暂无简介~
格式:doc
大小:19KB
软件:Word
页数:6
分类:互联网
上传时间:2018-04-24
浏览量:15