定義
定義了算法族议谷,分別封裝起來笆怠,讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶猪落。
通俗點(diǎn)的講贞远,就是將類中一組經(jīng)常變化的策略(方法)委托于一組具體策略類,這些策略類之間可以互相替換(共同繼承于一個(gè)接口)笨忌,自由選擇行為進(jìn)行組合蓝仲。
用途
1、對(duì)同種行為的復(fù)用
2官疲、繼承也可以通過重載來實(shí)現(xiàn)多種行為袱结,但是這種方式是采取硬編碼的,具有一定的強(qiáng)制性途凫,并且難以維護(hù)和難以擴(kuò)展垢夹。
3、可以動(dòng)態(tài)的變化行為维费。
參與對(duì)象
- 上下文對(duì)象:持有對(duì)抽象策略類的引用果元,還有其他一些不變化的方法和變量促王。
- 抽象策略對(duì)象:通常用接口實(shí)現(xiàn)
- 具體策略對(duì)象:實(shí)現(xiàn)了不同功能的不同算法
舉例應(yīng)用
一個(gè)網(wǎng)絡(luò)游戲中有多種不同的角色,每種角色一次可以使用一個(gè)武器而晒,在游戲過程中可以更換武器蝇狼。
進(jìn)行抽象
- 上下文對(duì)象:不同的角色
- 抽象策略對(duì)象:使用武器
- 具體策略對(duì)象:使用具體的武器
類圖
- Character:不同角色的抽象類
- WeaponBehavior:使用武器這種行為的接口
具體實(shí)現(xiàn)
Character:
public class Character {
String name;
WeaponBehavior behavior = new KnifeBehavior();
public Character(String name) {
this.name = name;
}
public void fight(){
System.out.print(name+":");
behavior.userWeapon();
}
public void setBehavior(WeaponBehavior behavior) {
this.behavior = behavior;
}
}
具體角色:
public class King extends Character {
public King(String name) {
super(name);
}
}
public class Queen extends Character {
public Queen(String name) {
super(name);
}
}
public class Knight extends Character {
public Knight(String name) {
super(name);
}
}
使用武器接口:
public interface WeaponBehavior {
void userWeapon();
}
具體實(shí)現(xiàn):
public class SwordBehavior implements WeaponBehavior{
@Override
public void userWeapon() {
System.out.println("用寶劍攻擊!");
}
}
public class KnifeBehavior implements WeaponBehavior {
@Override
public void userWeapon() {
System.out.println("用匕首攻擊倡怎!");
}
}
public class BowAndArrowBehavior implements WeaponBehavior {
@Override
public void userWeapon() {
System.out.println("用弓箭射擊迅耘!");
}
}
public class AxeBehavior implements WeaponBehavior {
@Override
public void userWeapon() {
System.out.println("用斧頭砍劈!");
}
}
使用:
public class Main {
public static void main(String[] args) {
King king = new King("King 1");
king.setBehavior(new SwordBehavior());
king.fight();
king.setBehavior(new KnifeBehavior());
king.fight();
}
}
Console:
King 1:用寶劍攻擊监署!
King 1:用匕首攻擊!
Process finished with exit code 0
通過案例就可以發(fā)現(xiàn)豹障,使用武器這種行為的具體實(shí)現(xiàn)不是由角色本身實(shí)現(xiàn),而委托于WeaponBehavior的具體實(shí)現(xiàn)類(這種面向接口編程的方式可以靈活的擴(kuò)展)焦匈,可以動(dòng)態(tài)的選擇對(duì)應(yīng)的策略適應(yīng)不同的場(chǎng)景血公。
總結(jié):
1、找出應(yīng)用中可能需要變化之處缓熟,把它們獨(dú)立出來累魔,不要和那些不需要變化的代碼混在一起。
如果例子中够滑,經(jīng)常變化的fight()行為不委托于WeaponBehavior實(shí)現(xiàn)垦写,那么就很難維護(hù),修改的時(shí)候需要修改很多處彰触。
2梯投、針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程况毅。
使用WeaponBehavior這種接口(抽象類也可以)分蓖,就能夠很好的利用多態(tài)的性質(zhì),不必知道具體實(shí)現(xiàn)尔许,也可以靈活的擴(kuò)展么鹤,增加新的具體行為實(shí)現(xiàn),而不影響原來的實(shí)現(xiàn)味廊。
3蒸甜、多用組合,少用繼承
組合具有更好的靈活性余佛,WeaponBehavior采用組合的方式和Character進(jìn)行結(jié)合柠新,可以動(dòng)態(tài)的改變行為,而且也可以隱藏行為的具體實(shí)現(xiàn)辉巡。