策略模式
定義一組算法,將每個(gè)算法都封裝起來(lái)兜畸,使得它們之間可以相互替換。策略模式讓算法獨(dú)立于調(diào)用它的客戶端而獨(dú)立變化
包含角色
- 抽象策略(Strategy):通常由接口或抽象類實(shí)現(xiàn)碘梢,定義了多個(gè)具體策略的公共接口咬摇,具體策略類中各種不同的算法以不同的方式實(shí)現(xiàn)這個(gè)接口;Context使用這些接口調(diào)用不同實(shí)現(xiàn)的算法
- 具體策略(ConcreteStrategy):實(shí)現(xiàn)Strategy接口或繼承于抽象類Strategy煞躬,封裝了具體的算法和行為
- 環(huán)境類(Contex):持有一個(gè)公共策略接口的引用肛鹏,直接給客戶端調(diào)用
實(shí)例
玩槍戰(zhàn)類游戲簡(jiǎn)單實(shí)現(xiàn),可以根據(jù)不同戰(zhàn)場(chǎng)情況恩沛,切換槍支
策略接口
/**
* 策略對(duì)象
*/
public interface Weapon {
public void gun();
}
策略實(shí)現(xiàn)類
/**
* 策略實(shí)現(xiàn)類
*/
public class AWM implements Weapon {
@Override
public void gun() {
System.out.println("AWM ...");
}
}
public class S12K implements Weapon {
@Override
public void gun() {
System.out.println("S12K ...");
}
}
環(huán)境類
/**
* 環(huán)境
*/
public class Context {
private Weapon weapon;
public Context(Weapon weapon) {
this.weapon = weapon;
}
public Weapon getWeapon() {
return weapon;
}
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
public void gun() {
weapon.gun();
}
}
測(cè)試類
public class Run {
public static void main(String[] args) {
Context context = new Context(new AWM());
context.gun();
context.setWeapon(new S12K());
context.gun();
}
}
// 輸出結(jié)果
AWM ...
find enemies 30 meters ahead
S12K ...