定義:定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶。
適用性
許多相關(guān)的類僅僅是行為有異。“策略”提供了一種用多個(gè)行為中的一個(gè)行為來配置一個(gè)類的算法。
需要使用一個(gè)算法的不同變體。例如,你可能會(huì)定義一些反映不容的空間/時(shí)間權(quán)衡的算法。當(dāng)這些變體實(shí)現(xiàn)了一個(gè)算法的類層次時(shí)[H087],可以使用策略模式。
算法使用客戶不應(yīng)該知道的數(shù)據(jù)??梢允褂貌呗阅J揭员苊獗┞稄?fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
一個(gè)類定義了多種行為,并且這些行為在這個(gè)類的操作中以多個(gè)條件語句的形式出現(xiàn)。將相關(guān)的條件分支移入它們各自的Strategy類中以代替這些條件語句。
例子:以下的例子取自一個(gè)動(dòng)作冒險(xiǎn)游戲。你將看到代表游戲角色的類和角色可以使用的武器行為的類。每個(gè)角色一次只能只用一種武器,但是可以在游戲的過程中切換武器。
1:定義武器接口及實(shí)現(xiàn)類
package strategy;
/**
* 定義武器行為接口
* @author User
*
*/
public interface WeaponBehavior {
public void userWeapon();//選擇所使用的武器
}
package strategy;
public class BowAndArrorBehavior implements WeaponBehavior {
/**
* 實(shí)現(xiàn)用弓箭射擊
*/
public void userWeapon() {
System.out.println("用弓箭射擊");
}
}
package strategy;
public class SwordBehavior implements WeaponBehavior {
/**
* 實(shí)現(xiàn)用寶劍攻擊行為
*/
public void userWeapon() {
System.out.println("用寶劍攻擊!!");
}
}
package strategy;
public class KnightBehavior implements WeaponBehavior {
/**
* 實(shí)現(xiàn)用匕首刺殺的行為
*/
public void userWeapon() {
System.out.println("用匕首刺殺!!");
}
}
2:定義角色
package strategy;
/**
* 角色的抽象父類 定義抽象fight方法以及策略屬性
* @author User
*
*/
public abstract class Character {
protected WeaponBehavior weapon;//策略調(diào)用 武器
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:測(cè)試類
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();
//使用默認(rèn)的武器
System.out.println("**************使用默認(rèn)武器****************");
king.performFight();
queen.performFight();
//切換武器
king.setWeapon(knightBehavior);
queen.setWeapon(swordBehavior);
System.out.println("**************更換武器后****************");
king.performFight();
queen.performFight();
}
}
4:結(jié)果
**************使用默認(rèn)武器****************
King:用寶劍攻擊!!
queen:用匕首刺殺!!
**************更換武器后****************
King:用匕首刺殺!!
queen:用寶劍攻擊!!
適用性
許多相關(guān)的類僅僅是行為有異。“策略”提供了一種用多個(gè)行為中的一個(gè)行為來配置一個(gè)類的算法。
需要使用一個(gè)算法的不同變體。例如,你可能會(huì)定義一些反映不容的空間/時(shí)間權(quán)衡的算法。當(dāng)這些變體實(shí)現(xiàn)了一個(gè)算法的類層次時(shí)[H087],可以使用策略模式。
算法使用客戶不應(yīng)該知道的數(shù)據(jù)??梢允褂貌呗阅J揭员苊獗┞稄?fù)雜的、與算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)。
一個(gè)類定義了多種行為,并且這些行為在這個(gè)類的操作中以多個(gè)條件語句的形式出現(xiàn)。將相關(guān)的條件分支移入它們各自的Strategy類中以代替這些條件語句。
例子:以下的例子取自一個(gè)動(dòng)作冒險(xiǎn)游戲。你將看到代表游戲角色的類和角色可以使用的武器行為的類。每個(gè)角色一次只能只用一種武器,但是可以在游戲的過程中切換武器。
1:定義武器接口及實(shí)現(xiàn)類
package strategy;
/**
* 定義武器行為接口
* @author User
*
*/
public interface WeaponBehavior {
public void userWeapon();//選擇所使用的武器
}
package strategy;
public class BowAndArrorBehavior implements WeaponBehavior {
/**
* 實(shí)現(xiàn)用弓箭射擊
*/
public void userWeapon() {
System.out.println("用弓箭射擊");
}
}
package strategy;
public class SwordBehavior implements WeaponBehavior {
/**
* 實(shí)現(xiàn)用寶劍攻擊行為
*/
public void userWeapon() {
System.out.println("用寶劍攻擊!!");
}
}
package strategy;
public class KnightBehavior implements WeaponBehavior {
/**
* 實(shí)現(xiàn)用匕首刺殺的行為
*/
public void userWeapon() {
System.out.println("用匕首刺殺!!");
}
}
2:定義角色
package strategy;
/**
* 角色的抽象父類 定義抽象fight方法以及策略屬性
* @author User
*
*/
public abstract class Character {
protected WeaponBehavior weapon;//策略調(diào)用 武器
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:測(cè)試類
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();
//使用默認(rèn)的武器
System.out.println("**************使用默認(rèn)武器****************");
king.performFight();
queen.performFight();
//切換武器
king.setWeapon(knightBehavior);
queen.setWeapon(swordBehavior);
System.out.println("**************更換武器后****************");
king.performFight();
queen.performFight();
}
}
4:結(jié)果
**************使用默認(rèn)武器****************
King:用寶劍攻擊!!
queen:用匕首刺殺!!
**************更換武器后****************
King:用匕首刺殺!!
queen:用寶劍攻擊!!