Strategy Pattern:html
The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.算法
第一個設計原則編程
找出應用中可能須要變化之處,把它們獨立出來,不要和那些不須要變化的代碼混在一塊兒,把會變化的部分取出並「封裝」起來,好讓其餘部分不受影響。從而使變化引發的不經意後果變少,系統更有彈性,實現對改變關閉對擴展開放的原則。在實際的編碼過程當中能夠隨心所遇的使用多態,繼承,封裝三大特性。設計模式
第二個設計原則ide
針對接口編程而不是針對實現編程。this
第三個設計原則編碼
多用組合,少用繼承。spa
策略模式組成:設計
策略模式的應用場景:code
一、 多個類只區別在表現行爲不一樣,可使用Strategy模式,在運行時動態選擇具體要執行的行爲。
二、 須要在不一樣狀況下使用不一樣的策略(算法),或者策略還可能在將來用其它方式來實現。
三、 對客戶隱藏具體策略(算法)的實現細節,彼此徹底獨立。
具體應用案例
package cn.com.dp.characters; import cn.com.dp.imp.Weapon;
public abstract class Character { //Character有一個weapon接口對應的行爲 private Weapon weapon; public Weapon getWeapon() { return weapon; } public void setWeapon(Weapon weapon) { this.weapon = weapon; } public abstract void fight(); public abstract String selfInfo(); }
package cn.com.dp.characters; /** * 角色:郭嘉 * * @author cpt * */ public class GuoJia extends Character { @Override public void fight() { System.out.print(selfInfo()); super.getWeapon().attack(); } @Override public String selfInfo() { return "呵呵,就這樣吧...."; } }
package cn.com.dp.characters; /** * 角色:賈詡 * @author cpt * */ public class JiaXu extends Character{ @Override public void fight() { System.out.print(selfInfo()); getWeapon().attack(); } @Override public String selfInfo() { return "我能完殺!!!"; } }
package cn.com.dp.imp; /** * 全部武器攻擊效果接口 * @author cpt * */ public interface Weapon { void attack(); }
package cn.com.dp.impl; import cn.com.dp.imp.Weapon; /** * 諸葛連弩攻擊效果,可複用替換 * @author cpt * */ public class AK47 implements Weapon { @Override public void attack() { System.out.println("AK47連續攻擊效果"); } }
package cn.com.dp.impl; import cn.com.dp.imp.Weapon; /** * 麒麟弓攻擊效果,可複用替換 * @author cpt * */ public class UnicornBow implements Weapon { @Override public void attack() { System.out.println("麒麟弓命中射馬攻擊效果"); } }
package cn.com.dp.context; import cn.com.dp.characters.GuoJia; import cn.com.dp.characters.JiaXu; import cn.com.dp.impl.AK47; import cn.com.dp.impl.UnicornBow; public class StrategyTestContext { public static void main(String[] args) { AK47 ak47 = new AK47(); UnicornBow unicornBow=new UnicornBow(); GuoJia guoJia = new GuoJia(); guoJia.setWeapon(ak47); guoJia.fight(); JiaXu jiaXu = new JiaXu(); jiaXu.setWeapon(unicornBow); jiaXu.fight(); jiaXu.setWeapon(ak47); jiaXu.fight(); } }
關於策略模式能不能消除if else判斷結構,我的認爲策略模式是作不到。
http://programmers.stackexchange.com/questions/146761/design-pattern-for-handling-a-response
http://industriallogic.com/xp/refactoring/conditionalWithStrategy.html
我的對策略模式理解總結:
全部的設計模式並非爲了爲了約定編程規範,而是一種總結下來針對特定需求的設計模式而毫不是編程模式,徹底沒有必要刻意去遷就設計模式,並且設計模式並非什麼高深的技術不過是巧妙地運用Java特性對代碼進行解耦。可是瞭解各個模式的設計技巧核心本質對之後設計項目以及編寫模塊代碼會有很大的幫助。策略模式巧妙的地方在於把應用中一類類似的變化的行爲代碼封裝成可複用獨立於執行環境的組件供策略環境角色隨意組合調用,若是變化的行爲代碼不可複用那麼就沒有必要使用策略模式。