定義:策略模式定義了算法族(每一個行爲的實現都是算法,合起來就是算法族),分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。java
設計原則:算法
一、找出應用中可能須要變化之處,把它們獨立出來,不要和那些不須要的變化的代碼混在一塊兒編程
二、針對接口編程,而不是針對實現編程(利用多態)測試
三、多用組合,少用繼承設計
每個鴨子都有一個FlyBehavior和QuackBehavior,能夠將飛行和呱呱叫的行爲都委託給它們處理。code
當兩個類結合起來使用,就是組合。這種和繼承的不一樣在於,鴨子的行爲不是繼承來的,而是和適當的行爲對象「組合」來的。orm
Duck類:對象
Duck.java package com.sun; public abstract class Duck { /* * 下面兩個類屬於變化的部分 */ //飛的類 FlyBehavior flyBehavior; //叫的類 QuackBehavior quackBehavior; public Duck(){ } public abstract void display(); public void performFly(){ //委託給行爲類 flyBehavior.fly(); } public void performQuack(){ //委託給行爲類 quackBehavior.quack(); } /* * 增長另個新方法,實現動態設定行爲 */ public void setFlyBehavior(FlyBehavior fb){ //會經過接口(多態的表現形式之一)行爲改變爲相應的飛行行爲(調用相應行爲的方法) flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior = qb; } public void swim(){ System.out.println("All ducks float,even decoys!"); } }
MallardDuck類:繼承
package com.sun; public class MallardDuck extends Duck{ public MallardDuck(){ //是對MallardDuck的具體實現 quackBehavior = new Quack(); flyBehavior = new FlywithWings(); } public void display(){ System.out.println("I'm a real Mallard duck"); } }
ModelDuck類:接口
package com.sun; public class ModelDuck extends Duck { public ModelDuck(){ //經過具體實現測試,靜態設定行爲 flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public void display() { System.out.println("I'm a model duck"); } }
飛的行爲接口
package com.sun; /* * 飛的行爲類 */ public interface FlyBehavior { public void fly(); }
如下是飛的接口的三個實現類:
package com.sun; public class FlyNoWay implements FlyBehavior { public void fly() { System.out.println("i can't fly!!"); } } package com.sun; public class FlyRocketPowered implements FlyBehavior { public void fly() { System.out.println("I'm fly with a rocket!"); } } package com.sun; public class FlywithWings implements FlyBehavior { public void fly() { System.out.println("I'm flying!!"); } }
QuackBehavior行爲的接口:
package com.sun; /* * 叫的行爲類 */ public interface QuackBehavior { public void quack(); }
如下是QuackBehavior接口的實現類:
package com.sun; public class Quack implements QuackBehavior { public void quack() { System.out.println("quack!!"); } } package com.sun; public class Squeak implements QuackBehavior { public void quack() { System.out.println("quack"); } } package com.sun; public class MuteQuack implements QuackBehavior { public void quack() { System.out.println("<<>silence>"); } }
測試類:
package com.sun; /* * 測試類 */ public class MiniDuckSimulator { public static void main(String[] args) { //靜態設定行爲 Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly(); /* 動態設定行爲,經過在Duck中增長兩個set方法 在運行時想改變鴨子的行爲,只需調用鴨子的setter方法就能夠 */ Duck model = new ModelDuck(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }