定義:定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
適用性
許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的算法。
需要使用一個算法的不同變體。例如,你可能會定義一些反映不容的空間
/時間權衡的算法。當這些變體實現了一個算法的類層次時[H087],可以使用策略模式。
算法使用客戶不應該知道的數據。可以使用策略模式以避免暴露復雜的、與算法相關的數據結構。
一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
 例子:以下的例子取自一個動作冒險游戲。你將看到代表游戲角色的類和角色可以使用的武器行為的類。每個角色一次只能只用一種武器,但是可以在游戲的過程中切換武器。
1:定義武器接口及實現類
package strategy;
/**
 * 定義武器行為接口
 * 
@author User
 *
 
*/
public interface WeaponBehavior {
    
public void userWeapon();//選擇所使用的武器
}
package strategy;
public class BowAndArrorBehavior implements WeaponBehavior {
    
/**
     * 實現用弓箭射擊
     
*/
    
public void userWeapon() {
        System.out.println(
"用弓箭射擊");
    }
}
package strategy;
public class SwordBehavior implements WeaponBehavior {
    
/**
     * 實現用寶劍攻擊行為
     
*/
    
public void userWeapon() {
        System.out.println(
"用寶劍攻擊!!");
    }
}
package strategy;
public class KnightBehavior implements WeaponBehavior {
    
/**
     * 實現用匕首刺殺的行為
     
*/
    
public void userWeapon() {
        System.out.println(
"用匕首刺殺!!");
    }
}
2:定義角色
package strategy;
/**
 * 角色的抽象父類 定義抽象fight方法以及策略屬性
 * 
@author User
 *
 
*/
public abstract class Character {
    
protected WeaponBehavior weapon;//策略調用  武器
    public abstract void fight();
    
protected String name;
    
//委托給行為類
    public void performFight(){
        System.out.print(name
+":");
        weapon.userWeapon();
    }
    
/**
     * 改變所使用的武器
     * 
@param weapon
     
*/
    
public void setWeapon(WeaponBehavior weapon) {
        
this.weapon = weapon;
    }
   
}
package strategy;
public class King extends Character {
   
    
public King(){
        
this.weapon=new SwordBehavior();//用寶劍
        this.name="King";
    }
   
    @Override
    
public void fight() {
        System.out.println(
"King fight");
    }
}
package strategy;
public class Queen extends Character {
   
    
public Queen(){
        
this.weapon=new KnightBehavior();
        
this.name="queen";
    }
   
    @Override
    
public void fight() {
        System.out.println(
"queen fight");
    }   
}
3:測試類
package strategy;
public class Test {
    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
//定義能夠使用的武器
        SwordBehavior swordBehavior=new SwordBehavior();
        KnightBehavior knightBehavior
=new KnightBehavior();
        BowAndArrorBehavior bowAndArrorBehavior
=new BowAndArrorBehavior();
       
        
//定義角色
        Character king=new King();
        Character queen
=new Queen();
       
        
//使用默認的武器
        System.out.println("**************使用默認武器****************");
        king.performFight();
        queen.performFight();
       
        
//切換武器
        king.setWeapon(knightBehavior);
        queen.setWeapon(swordBehavior);
       
        System.out.println(
"**************更換武器后****************");
        king.performFight();
        queen.performFight();
    }
}
4:結果
**************使用默認武器****************
King:用寶劍攻擊
!!
queen:用匕首刺殺
!!
**************更換武器后****************
King:用匕首刺殺
!!
queen:用寶劍攻擊
!!