03 策略模式 (Strategy).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
策略模式 (Strategy) “开闭”原则是指一个软件的实体应当对扩展开放,对修改关闭。即我们在设计一个模块时,应当做到这个模块在不被修改的前提下对扩展开放。 根据面向对象设计的“开-闭”原则,当有一组算法对于某些应用是必不可少的,客户可能需要算法的多种不同实现,允许增加新的算法实现或者改变现有的算法实现,在设计时,我们可以把这样的算法封装到单独的类中,称为strategy。 策略模式就是从对可变性的东西封装的原则,实现“开闭原则”的模式。 例子 每年在新生入学时,由于本科生、硕士生和博士生,他们助学金额的计算方法不同。请编写软件实现。 一般实现:用分支语句。 客户端 public class Test { public static void main(String[] args) { if(student is Granduate){ //xxxxxxx }else if if(student is Master){ //xxxxxxx } if(student is Doctor){ //xxxxxxx } } } 如果产生以下二个问题: 如果计算方法发生变化 增加了助学金计算方法(如增加了博士后的助学金) 就要修改客户端的代码,这显然违背了“开闭原则”。 仔细分析,这个问题的可变性代码就是3个算法,可以考虑先把这3个算法分别用三个类封装起来: public class GranduateStipend{ public void Payoff(){//本科生计算算法} } public class MasterStipend{ public void Payoff(){//硕士生计算算法} } public class DoctorStipend{ public void Payoff(){//博士生计算算法} } 根据面向抽象编程的原则,可以把3个算法抽象成一个接口或者一个抽象类,并使这3个算法类成为它的子类。 实际中客户端是面对接口编程,,而真正的算法实现却是由抽象接口的子类完成,做到了可变的算法和客户实现隔离。 Strategy模式(三) 结构: 参与者 Strategy、ConcreteStrategy、Context 协作方法: Strategy and Context interact to implement the chosen algorithm A context forwards requests from its clients to its strategy Context public class Context { Strategy stra; public Context(Strategy stra) { this.stra = stra; } public void doMethod() { stra.method(); } } 客户端 public class Test { public static void main(String[] args) { Context ctx = new Context(new StrategyImplA()); ctx.doMethod(); ctx = new Context(new StrategyImplB()); ctx.doMethod(); ctx = new Context(new StrategyImplC()); ctx.doMethod(); } } 使用策略模式如何解决前面提到的二个问题?? 如果计算方法发生变化 增加了助学金计算方法(如增加了博士后的助学金) 购物车例子 某网站对教育类书籍实行每本书1元的折扣,对连环画书籍折扣7%的促销折扣,对非教育类图书实行3%的折扣,其余书没有折扣。 解决方法: 1.在客户端中通过条件语句选择使用哪个算法。 2.客户端利用继承机制,在子类中实现不同的行为。 3.使用策略模式。 定义抽象接口: abstract public class DiscountStrategy { abstract public double calculateDiscount(); } 定义三个具体实现的类: //百分比的折扣类(如书的价格20元,折扣7%则 20*7%=1.4元 public class PercentageStrategy extends DiscountStrategy { private double percent = 0.0; pr

文档评论(0)

82393aa + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档