2009年7月23日 星期四

Design Pattern - 什麼是鴨子模式?

什麼是鴨子模式?

之前開發時最常用extends的方式, 通常把共用的東西寫在一起

缺點:
1.父類很難預知到extends的所有共用的東西 (未來沒事別改主要的code)
2.若要改共用的東西, 要檢查所有extends
3.???


Bird class
display()
fly()

Hooter class
fly()

Sparrow class
fly()


new hooter().fly(); --> 這時每一種鳥怎麼飛就寫死

因為每種鳥的飛行方式不太一樣, 所以若把各種飛的方式分別實作, fly()改成interface


public interface FlyBehavior
fly()

public class FlyFast implements FlyBehavior
fly(){ 飛很快 }

public class FlySlow implements FlyBehavior
fly(){ 飛很慢 }


public abstract class Bird{
public FlyBehavior flyBehavior;

public abstract void display(){}

public doFly(){
flyBehavior.fly(); --> delegate
}

public void setFlyBehavior(FlyBehavior fb){
this.flyBehavior = fb;
}
}

public class Hooter extends Bird{

public Hooter(){
flyBehavior = new FlyFast();
xxx = new xxx();
}
}

public class Test{
public static void main(String[] args){

//直接寫在建構子裡, 這樣在new Hooter()時, 就決定它的fly方式, 但這樣寫不太好
Bird hooter = new Hooter();
hooter.doFly();

//不過我們的Bird class有setFlyBehavior,
//這裡就可以動態的使用那一個實現fly的class了
Bird hooter2 = new Hooter();
hooter2.setFlyBehavior(new FlySlow());
hooter2.doFly();
}
}


書上講的名言?
1.可能會變的地方,就獨立封裝起來,不要跟固定的code寫在一起
2.針對接口編程,而不是針對實現編程
不太懂, 可能是指要實現一個功能, 不要直接就寫class了, 反正隨時用interface就對了吧

以上是參考head first design pattern一書的理解

0 意見: