设计模式解读之一: 策略模式.docVIP

  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文档。上传文档
查看更多
设计模式解读之一: 策略模式当我们掌握了Java的语法,当我们了解了面向对象的封装、继承、多态等特性,当我们可以用Swing、Servlet、JSP技术构建桌面以及Web应用,不意味着我们可以写出面向对象的程序,不意味着我们可以很好的实现代码复用,弹性维护,不意味着我们可以实现在维护、扩展基础上的代码复用。一把刀,可以使你制敌于无形而于江湖扬名,也可以只是一把利刃而使你切菜平静。Java,就是这把刀,它的威力取决于你使用的方式。当我们陷入无尽无止重复代码的泥沼,当我们面临牵一发而动全身的维护恶梦, 你应该想起“设计模式”这个行动秘笈。面向对象的精义,看似平淡,其实要经过艰苦实践才能成功。而构造OO系统的隐含经验于是被前人搜集而成并冠以“设计模式”之名。我们应该在编码行动初始就携带以它。接下来,让我们步“四人组”先行者之后,用中国文字、用实际案例领略模式于我们代码焕然一新的改变: 设计模式解读之一: 策略模式 1. 模式定义 把会变化的内容取出并封装起来,以便以后可以轻易地改动或扩充部分,而不影响不需要变化的其他部分; 2. 问题缘起 当涉及至代码维护时,为了复用目的而使用继承,结局并不完美。对父类的修改,会影响到子类型。在超类中增加的方法,会导致子类型有该方法,甚至连那些不该具备该方法的子类型也无法免除。示例,一个鸭子类型: public abstract class Duck //所有的鸭子均会叫以及游泳,所以父类中处理这部分代码 public void quack System.out.println Quack ; public void swim System.out.println All ducks float, even decoys. ; //因为每种鸭子的外观是不同的,所以父类中该方法是抽象的,由子类型自己完成。 public abstract void display ; public class MallardDuck extends Duck //野鸭外观显示为绿头 public void display System.out.println Green head. ; public class RedHeadDuck extends Duck //红头鸭显示为红头 public void display System.out.println Red head. ; public class RubberDuck extends Duck //橡皮鸭叫声为吱吱叫,所以重写父类以改写行为 public void quack System.out.println Squeak ; //橡皮鸭显示为黄头 public void display System.out.println Yellow head. ; 上述代码,初始实现得非常好。现在我们如果给Duck.java中加入fly 方法的话,那么在子类型中均有了该方法,于是我们看到了 会飞的橡皮鸭子,你看过吗?当然,我们可以在子类中通过空实现重写该方法以解决该方法对于子类型的影响。但是父类中再增加其它的方法呢? 通过继承在父类中提供行为,会导致以下缺点: a. 代码在多个子类中重复; b. 运行时的行为不容易改变; c. 改变会牵一发动全身,造成部分子类型不想要的改变; 好啦,还是刚才鸭子的例子,你也许想到使用接口,将飞的行为、叫的行为定义为接口,然后让Duck的各种子类型实现这些接口。这时侯代码类似于: public abstract class Duck //将变化的行为 fly 以及quake 从Duck类中分离出去定义形成接口,有需求的子类中自行去实现 public void swim System.out.println All ducks float, even decoys. ; public abstract void display ; //变化的 fly 行为定义形成的接口 public interface FlyBehavior void fly ; //变化的 quack 行为定义形成的接口 public interface QuackBehavior void quack ; //野鸭子会飞以及叫,所以实现接口? FlyBehavior, QuackBehavior public class MallardDuck extends Duck implements FlyBehavior, QuackBehavior public void display System.out.println Green head. ; public void fly System.out.println Fly. ; pub

文档评论(0)

80092355km + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档