策略模式

策略模式是把程序不變的邏輯與可變的邏輯分別封裝,讓算法的變化獨立于使用算法的客戶,這樣設計有很好的擴展性,可根據需求修改算法或增刪都不會影響客戶代碼。

示例:設計鴨子

一、鴨子基礎類
封裝了鴨子的基礎特性,包含了行為和特征,行為用接口的形式聲明,不實現(xiàn)具體行為,鴨子的子類可動態(tài)設置行為,與鴨子本身解耦,特征用抽象方法來聲明,是每個鴨子必有的特性。

public abstract class BaseDuck {

    protected BaseFlyBehavior flyBehavior;
    protected BaseQuackBehavior quackBehavior;

    public void setFlyBehavior(BaseFlyBehavior flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void setQuackBehavior(BaseQuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }

    /**
     * 鴨子介紹
     */
    public abstract void display();

    /**
     * 鴨子飛
     */
    public void performFly() {
        flyBehavior.flay();
    }

    /**
     * 鴨子叫
     */
    public void performQuack() {
        quackBehavior.quack();
    }
}

二、定義鴨子行為接口
新創(chuàng)建的所有行為都必須實現(xiàn)此接口,然后在覆蓋的方法中實現(xiàn)具體的行為(算法)。

1.鴨子的飛行

public interface BaseFlyBehavior {
    public void flay();
}

2.鴨子的叫喚

public interface BaseQuackBehavior {
    public void quack();
}

三、實現(xiàn)鴨子的行為

都需實現(xiàn)BaseFlyBehavior、BaseQuackBehavior接口,然后在flay()、quack()中編寫具體行為。
1.會飛

public class FlyWithWings implements BaseFlyBehavior {

    @Override
    public void flay() {
        Log.i("==TAG==", "會飛");
    }
}

2.不會飛

public class FlyNoWay implements BaseFlyBehavior {

    @Override
    public void flay() {
        Log.i("==TAG==", "不會飛");
    }
}

3.會嘎嘎叫

public class Quack implements BaseQuackBehavior {

    @Override
    public void quack() {
        Log.i("==TAG==", "嘎嘎叫");
    }
}

4.不會叫

public class MuteQuack implements BaseQuackBehavior {

    @Override
    public void quack() {
        Log.i("==TAG==", "不會叫");
    }
}

4.具備火箭動力

public class FlyRocketPowered implements BaseFlyBehavior {

    @Override
    public void flay() {
        Log.i("==TAG==", "我具備了火箭動力");
    }
}

三、實現(xiàn)多種類型的鴨子

1.綠頭鴨
會嘎嘎叫,會飛

public class MallardDuck extends BaseDuck {

    public MallardDuck(){
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }

    @Override
    public void display() {
        Log.i("==TAG==","我是綠頭鴨");
    }
}

2.模型鴨
不會叫,不會飛

public class ModelDuck extends BaseDuck {

    public ModelDuck(){
        quackBehavior = new MuteQuack();
        flyBehavior = new FlyNoWay();
    }

    @Override
    public void display() {
        Log.i("==TAG==", "我是模型鴨");
    }
}

四、生產鴨子

可以看到所有的鴨子都實現(xiàn)了鴨子基類,并用鴨子基類聲明,這使得生產的多個鴨子有了很好的約束性,同時行為的分離封裝保證了其很高的可擴展性,這樣的設計能應對不斷變化的需求,屆時只需創(chuàng)建新的行為即可。

public class StrategyControl {

    private static StrategyControl mInstance;

    public static StrategyControl getInstance() {
        if (mInstance == null) {
            synchronized (StrategyControl.class) {
                if (mInstance == null) {
                    mInstance = new StrategyControl();
                }
            }
        }
        return mInstance;
    }

    public void execute() {
        //綠頭鴨
        BaseDuck mallardDuck = new MallardDuck();
        mallardDuck.display();
        mallardDuck.performQuack();
        mallardDuck.performFly();

        //模型鴨
        BaseDuck modelDuck = new ModelDuck();
        modelDuck.display();
        modelDuck.performQuack();
        modelDuck.performFly();

        //模型鴨具備火箭動力
        modelDuck.setFlyBehavior(new FlyRocketPowered());
        modelDuck.performFly();
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容