【Head First設計模式】-Strategy模式
一、從訂餐開始
小王和小劉兩人到餐廳點餐,兩人分別如下告訴廚師。
小王:我要一杯加了香草冰淇淋的巧克力汽水。
小劉:一個黑與白。
這兩人點的餐有什么不同呢?其實是一樣的,都是同一份。只是小劉用專業的名字說來出,廚師一聽就明白。但小王沒有,他不懂,因此他與廚師之間沒有“共享的詞匯”。共享的詞匯不僅方便顧客點餐,也讓廚師不用記太多的事。
設計模式就是讓我們與其它的開發人員之間的共享詞匯,一旦懂得這些共享詞匯,和其它開發人員之間的溝通就容易很多。也讓那些不懂設計模式的程序開始學習模式。設計模式可以把思考架構的層次提高到模式層面,而不僅僅停留在瑣碎的對象上。
二、Strategy模式
1、兩大原則
設計模式真正體現的是Java的原則,而這些原則又通過這些優秀的模式反映出來。有些面向對象的原則,適用于所有的模式,當無法找到適當的模式解決問題時,這些原則就是唯一的標準了。Strategy模式體現了如下的兩大原則:
l 針對接口編程,而不是針對實現編程。
l 多用組合,少用繼承。
2.傳統設計 3.strategy設計 三、代碼實現 1.抽象類Duck.java package com.sterning.ch1_strategy; import com.sterning.ch1_strategy.behavior.FlyBehavior; import com.sterning.ch1_strategy.behavior.QuackBehavior; public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } public Duck(){ } public abstract void display(); public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } public void swim(){ System.out.println("All ducks float,even decoys!"); } } 2.行為封裝類 (1)接口 接口FlyBehavior.java package com.sterning.ch1_strategy.behavior; public interface FlyBehavior { public void fly(); } 接口FlyBehavior.java package com.sterning.ch1_strategy.behavior; public interface QuackBehavior { public void quack(); }
3.strategy設計
三、代碼實現
1.抽象類Duck.java
2.行為封裝類
(1)接口
接口FlyBehavior.java
(2)實現
FlyNoWay.java
FlyRocketPowered.java
FlyWithWings.java
MuteQuack.java
Quack.java
Squeak.java
3.實現類
MallardDuck.java
ModelDuck.java
4.測試類
MiniDuckSimulator.java
Powered by: BlogJava Copyright © 詩特林