設(shè)計(jì)模式 | 策略模式

策略模式

定義一組算法,將每個(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 ...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容