离弦之Ray

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 33 Comments :: 0 Trackbacks

Head first design patterns 一直被束之高阁,总算考完期末考试。然而,我却又要开始复习考研的东西了,整天看数学看的十分头晕,把这本书重新拿来看,权当连环画来看。

以前已经看过两章了,实在太过久远,只得重温一下。

前面的 Introduction 其实是非常有意思的,在这先不赘述了。

 

介绍的第一个 Pattern Strategy Pattern

通过一个 duck 的例子,在讲述 Strategy Pattern 的过程中引出了三个 Design Principles

它们是:

1.              Identify the aspects of your application that vary and separate them from what stays the same.

2.              Program to an interface, not an implementation.

3.              Favor composition over inheritance.

Duck 例子完美地体现了以上三个 Principles

一开始 Duck 类是这样的,里面有三个方法: quack(), swim() display(), 其它一些特殊的 Duck 子类继承这个父类,并重载 display 方法去显示各种不同种类的 Duck

 

现在需求变更,需要让一些 Duck 能够有飞的能力,理所当然地,在父类中加上了 fly() 这个方法。但一些不能飞的 Duck 类却同时拥有了 fly() 方法,这显然是不对的。

可能有人提出解决的方法是重载那些不需要 fly() 方法的 duck 类的 fly() ,让这个方法什么也不做,但你有没有想过如果这么处理,以后再加一些不需要一些方法的子类是不是很繁琐?

也许又有人想到了,把 fly() quack() 提取出来,编程 interface 。如果某个子类需要这个能力可以去 implement 这个 interface

有没有想过后果?每一个子类都要重写 fly() quack(),OO 的代码重用的特性荡然无存。

 

那什么才是最好的解决之道呢???

书里面给出了答案。

fly() quack() 两个功能提取出来这个思路是对的。这里体现了第一个 Principle 。首先声明 FlyBehavior() QuackBehavior() 两个 interface ,然后实现各种 fly quack ,比如 FlyWithWings, FlyNoWay Quack, Squeak 等等。这里体现了第二个 Principle

 

现在的 Duck 父类已经变了,里面有两个私有变量 FlyBehavior fb, QuackBehavior qb

Duck 父类甚至可以直接声明成 Abstract 类,当有子类继承它的时候,可以在构造函数里给 fb qb 初始化的时候直接赋给它需要的 fly quack 种类。这里体现了第三个 Principle

 

小小的一个例子已经分析的那么专业,让我受益匪浅。好书!

 

posted on 2006-07-06 14:17 离弦之ray的技术天空 阅读(284) 评论(1)  编辑  收藏 所属分类: Design Pattern

Feedback

# re: the first pattern 2006-08-12 00:24 icepv
是decorator模式吧。
讲得不错  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: