深入的浅出设计模式之策略模式.ppt

  1. 1、本文档共45页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
设计模式的入门 策略模式 本章的学习要点 了解设计模式的用途和优点 掌握设计OO的基本原则 理解本章所举的实例 开发实例 实例描述:我们要开发一个游戏鸭子,可以戏水,可以鸣叫。而且,在游戏中可能出现很多各种各样的鸭子。 设计:将设置一个鸭子超类,解决所有鸭子的共有操作,如游泳,鸣叫等,子类实现自己特殊的操作。 添加方法 如果需要给鸭子添加飞的方法,根据OO 带来的问题 超类添加一种方法,必然给所有的子类带来同样的方法。上述的例子,就是所有的鸭子都可以飞。 如何解决这个问题:我们可以采用子类方法覆盖的方法,如橡皮鸭子不会飞,覆盖橡皮鸭子飞的方法。 分析 上面我们采用继承的来解决程序的开放性和可扩充性,遇到了问题,为什么会这样? 因为超类作为所有类的父类,拥有所有子类的共性,但未来会出现什么子类,无从得知,因此,无法确定哪些是共性方法和共性属性。 继承 继承本是为了代码的复用,节省子类的代码。 但由于未来的不确定性,无法预知子类的多少? 继承必须有父类和子类,确定父类的属性和方法很关键。 继承的问题 代码在多个子类出现不必要的重复 无法事先预知所有的子类的所有行为 改变父类,会同时改变子类。 采用接口 接口在Java中是一个非常重要的概念 Java不支持多继承,但一个类可以实现多个接口。 采用接口覆盖鸭子飞和叫的方法,每一个会飞的或会叫的子类实现接口。 接口带来的问题 接口可以让每一个子类自己实现有特色的方法。 子类的代码无法重用,每一个子类都实现接口,即使子类的行为完全一致,也必须各自实现。 软件编写 尽量少修改 遇到新情况,希望不修改程序或少修改程序。 程序必须适应变化,而自身需要稳定。 最不变的就是变化 需求改变 平台改变 数据改变 程序设计原则 找出应用中可能需要变化之处,将其独立出来,把它们和无需变化的代码分割开,分而治之。 当需求改变时,代码需要改变,这部分是可变的,从而区分出那些是需要改变的,哪些是稳定的代码。 上面的例子中,duck类中,fly(),quack()方法会随着duck的不同而改变,因此提取出来 设计原则 针对接口编程,而不是针对实现编程。 我们利用接口代表每一个行为,如FlyBehavior QuackBehavior Duck类不实现这个接口,而是由我们设立的行为类来实现。 设计新的类时,子类使用接口所表示的行为,实现在行为类中,而不在子类中。 接口可以实现多态 在声明对象变量时,最好用超类型。 Dog d= new Dog() d.bark(); Animal animal = new Dog(); animal.makeSound(); a = getAnimal(); a.makeSound(); 实现鸭子的飞行行为 实现鸭子的鸣叫行为 上述的设计,让鸣叫,飞行等行为已经与duck类无关了, 我们增加duck类的行为,不会影响到鸣叫,飞行等行为 注意的问题 刚开始设计程序时,可能不会完全预测将来的情况,因此,应该使程序保持足够的弹性,以应付将来的可能的变化。 事先考虑的面面俱到是不可能的。 飞行,鸣叫等的动作行为成为一个类是可以的。 思考题 如果现在有了一种新的玩具duck,它采用螺旋浆飞行,该如何处理。 什么类还会用到FlywithWings 设计思想的实现 根据前面我们的设计,我们来实现duck类 子类的具体实现 public class MallardDuck extends Duck{ public MallardDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } public void display(){ System.out.pringln(“”); } } 动态设定行为 Duck类中加入两个新方法: public void SetFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void SetQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } 产生一个模型鸭 public class ModelDuck extends Duck{ public ModelDuck () { quackBehavior = new Quack(); flyBehavior = new FlyNoWay(); } public void display(){ Sys

您可能关注的文档

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档