- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java: 类与接口设计 School of Software xinguodong It start with a simple SimuDuck app 问题描述 J o e 上班的公司做了一套相当成功的模拟鸭子游戏S i m U D u c k。游戏中出现各种鸭子, 一边游泳戏水,一边呱呱叫。 此系统的内部设计使用了标准的OO 技术,设计了一个鸭子超类,并让各种鸭子继承自这个超类。 Design: But now we need the ducks to FLY 去年,公司的竞争压力加剧,公司主管认为该是创新的时候了, 他们需要在下周股东会议上展示一些真正让人印象深刻的东西来振奋人心。 主管认为, 此模拟程序需要会飞的鸭子, 将竞争者抛在后头在这个时候,joe的经理拍胸脯告诉主管们,J o e 只需要一个星期就可以搞定, “毕竟, Joe 是一个O O程序员...这有什么困难?” Joe’s design But something went horrible wrong What happened Joe忽略了一件事:并非Duck 所有的子类都会飞 当J o e 在D u c k 超类中加上新的行为, 这会使得某些子类也具有这个不恰当的行为。现在可好了!SimUDuck程序中有一个会飞的非动物。 对代码所做的局部修改,影响层面可能不只局部(会飞的橡皮鸭)! Joe realize this: Joe体会到了一件事: 当涉及”维护”时,为了”复用”(reuse)目的而使用继承,结局并不完美。 Joe thinks about inheritance Add a DecoyDuck in the classes Let’s discuss Joes design 利用继承提供鸭子行为,会导致下列那些缺点 A. 代码在多个子类中重复。 B. 运行时的行为不容易改变。 C. 我们不能让鸭子跳舞。 D. 难以得知所有鸭子的全部行为。 E. 鸭子不能同时又飞又叫。 F. 改变会牵一发动全身,造成其他鸭子不想要的改变。 How about an interface? J o e 认识到继承可能不是一个好的解决方法, 因为他刚刚拿到来自主管的备忘录,希望以后每六个月更新产品(至于更新的方法, 他们还没想到) 。 J o e 知道规格会常常改变, 每当有新的鸭子子类出现,他就要被迫检查是否需要覆盖fly() 和quark()... 这简直是无穷尽的恶梦。 所以,他需要一个更清晰的方法,让「某些」(而不是全部)鸭子类型可飞或可叫 Joe’s new idea for the design What do you think about this design 代码实现: source code of Duck public class Duck { public Duck() { } public void quack() { System.out.println(Duck classs quack method); } public void swim() { System.out.println(Duck classs swim method); } public abstract void display(); } source code of MallardDuck public class MallardDuck extends Duck { public MallardDuck() { } public void display() { System.out.println(This is MallardDucks display!); } } 代码实现 Duck类-接口版本 abstract public class Duck { public Duck() { } public void swim() { System.out.println(Duck classs swim method); } public abstract void display(); } DecoyDuck public class DecoyDuck extends Duck { public DecoyDuck() { } public void display() { System.out.println(Im a duck Decoy); } } 代码实现 FlyBehavior quack public interface FlyBehavior { public v
文档评论(0)