策略模式的定義:定義一組算法,分別封裝起來,讓他們之間可以相互替換(算法類實現同一個接口),此模式讓算法的變化獨立於使用算法的客戶。
如定義這樣一個玩家類:
class Player{
public Player(){
}
//根據不同的距離採取不同的攻擊
pubilc void attack(double distance){
if(distance<5)
//攻擊算法1
else if(distance<10)
//射擊算法2
else if
...
}
...
}
我們知道,玩家需要根據不同的距離採取不同的攻擊方法,但這樣一來不但使玩家類的fire方法顯得冗長,而且一旦有新的變化加入,或者算法需要改變,還要去修改類的內容,不符合類的設計原則。
因此,我們可以將不同的攻擊算法封裝成類,並且讓他們實現同一個接口:
interface AttackMode{
public void attack();
}
class 砍 implements AttackMode{
public void attack(){
...
}
}
class 削 implements AttackMode{
public void attack(){
...
}
}
再將我們的玩家類修改下:
class Player{
private AttackMode attachMode;
public Player(AttackMode attackMode){
this.attackMode=attackMode;
}
public void setAttackMode(AttackMode attackMode){
this.attackMode=attackMode;
}
pubilc void attack(){
attackMode.attack();
}
這樣我們就將算法的實現與客戶代碼分離開來,在外部代碼根據不同的情況,通過set方法設置不同算法即可,即使以後出現變化也不用修改玩家類。