今天看一個《head first design pattern》 書的第一章。發覺這本書真的和別人說的一樣的是一本好書呀。難怪獲得JOLT大獎。
策略模式:就是把不變的東西封裝,把變的東西通過代理實現,下面的例子是原書的例子
假設我們要設計一個鴨子游戲,那我們設計一個超類Duck
Duck 有這些屬性(是一個抽象類)
quack()
swim()
display()
// 外觀是綠頭 }// 鴨子的其他方法
MallardDuck繼承了Duck
display() {
// 外觀是綠頭 }
RedheadDuck繼承了Duck
display() {
// 外觀是紅頭 }
由於某些原因要讓有的鴨子會叫和會飛,一開始想在Duck超類上添加fly()和quack();看上去好想沒有什麼問題,但是所有的鴨子都會fly()和quack()嗎?想想也是呀假鴨和聾啞就不會quack
而且每一隻鴨的fly和quack可能不一樣那麼怎麼解決了。引用策略模式():
把fly的行爲封裝在FlyBehavior接口,同樣把quack的行爲封裝在QuackBehavior接口
public abstract class Duck {
FlyBehavior fl yBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();
public void performFly() {
fl yBehavior.fl y();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println(“All ducks fl oat, even decoys!”);
}
}
這裏用到了oo的多態
繼承Duck類的子類在實例化通過set##方法來把quackBehavior,QuackBehavior的實例動態加載
flybeh
FlyBehavior的行爲不一定只能給鴨,給雞給鳥呀QuackBehavior也是同樣的
上面的就是strategy pattern
其實我有個想法(實現上面的問題的方法):
public abstract class Duck {
public Duck() {
}
public abstract void display();
public adstract void performFly();
public abstarct void performQuack() ;
public void swim() {
System.out.println(“All ducks fl oat, even decoys!”);
}
}
策略模式:就是把不變的東西封裝,把變的東西通過代理實現,下面的例子是原書的例子
假設我們要設計一個鴨子游戲,那我們設計一個超類Duck
Duck 有這些屬性(是一個抽象類)
quack()
swim()
display()
// 外觀是綠頭 }// 鴨子的其他方法
MallardDuck繼承了Duck
display() {
// 外觀是綠頭 }
RedheadDuck繼承了Duck
display() {
// 外觀是紅頭 }
由於某些原因要讓有的鴨子會叫和會飛,一開始想在Duck超類上添加fly()和quack();看上去好想沒有什麼問題,但是所有的鴨子都會fly()和quack()嗎?想想也是呀假鴨和聾啞就不會quack
而且每一隻鴨的fly和quack可能不一樣那麼怎麼解決了。引用策略模式():
把fly的行爲封裝在FlyBehavior接口,同樣把quack的行爲封裝在QuackBehavior接口
public abstract class Duck {
FlyBehavior fl yBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();
public void performFly() {
fl yBehavior.fl y();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println(“All ducks fl oat, even decoys!”);
}
}
這裏用到了oo的多態
繼承Duck類的子類在實例化通過set##方法來把quackBehavior,QuackBehavior的實例動態加載
flybeh
FlyBehavior的行爲不一定只能給鴨,給雞給鳥呀QuackBehavior也是同樣的
上面的就是strategy pattern
其實我有個想法(實現上面的問題的方法):
public abstract class Duck {
public Duck() {
}
public abstract void display();
public adstract void performFly();
public abstarct void performQuack() ;
public void swim() {
System.out.println(“All ducks fl oat, even decoys!”);
}
}