《Head First 设计模式》之策略(一)

从模拟鸭子应用做起

Joe准备做一套成功的模拟鸭子游戏。游戏中会出现各种鸭子,一边游泳戏水,一边呱

呱叫。

设计了一个鸭子超类(SuPerClass),并让各种鸭子继承此超类。

 


 

现在想让鸭子能飞


 

可怕问题发生了

Joe忽略了一件事,并非Duck所有的子类都会飞。

 

我们能做的,只有根据鸭子的特性,覆写fly()方法才可以,该fly()或者实现一定功能或者什么事都不做。

 


在超类中加上fly(),就会导致所有的子类都具备fly(),连那些不具备fly()的子类也无法免除。所以,当涉及“维护”时,为了“复用”(reuse)目的而使用继承,结果可能会很糟。

 

因为这样做(利用继承来提供Duck的行为),带来的不好的地方:

  1. 代码在多个子类中重复。
  1. 运行时的行为不容易改变。
  1. 不能直接看出该鸭子都有哪些行为(虽然有fly()方法,但里面什么事都没做)
  1. 改变会牵一发动全身,造成其他鸭子不想要的改变。

 

利用接口如何

fly()从超类中取出来,放进一个“flyable接口”中,只有会飞的鸭子才实现此接口。同样的方式来设计“Quackable接口”,因为不是所有的鸭子都会叫。


想想这样如何?

……

虽然FlyableQuackable可以解决“一部分”问题(不会再有会飞的橡皮鸭),但却造成代码无法复用,依然不够好。

 

变是永远不变的

不管你在何处工作,构建些什么,用何种编程语言,在软件开发上,一直伴随你的那个不变真

理是?


不管当初软件设计得多好,一段时间之后,总是需要成长与改变

否则软件就会“死亡”。

 

封装变化,从零开始

设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

把变化的部分取出并封装起来,以便以后可以轻易地改动和扩充此部分,而不影响不需要变化的部分。


分开变化和不会变化的部分   

    你能想象出如何设计吗???

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值