23種設(shè)計(jì)模式之策略模式

優(yōu)點(diǎn):算法可自由切換,避免了多重條件判斷,擴(kuò)展性良好,符合開(kāi)閉原則。
缺點(diǎn):算法多了,類也增多,每個(gè)算法都會(huì)形成一個(gè)類,而且每個(gè)算法必須對(duì)上層暴露。

主要用于分離算法,選擇實(shí)現(xiàn)。

角色:

  • Context封裝角色,也叫作上下文角色,屏蔽高層模塊對(duì)策略、算法的直接訪問(wèn),封裝可能的變化。

  • Strategy抽象策略角色,策略算法家族的抽象,通常為接口定義每個(gè)算法必須具有的方法和屬性。

  • ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法。

例子從簡(jiǎn):模仿報(bào)價(jià),A類型客戶不打折,B類型客戶打9折,C類型客戶打8折,D類型客戶打7折。

創(chuàng)建抽象策略角色(Strategy):

/**
 * Strategy抽象策略角色,策略算法家族的抽象,通常為接口定義每個(gè)算法必須具有的方法和屬性。
 */

public interface Strategy {
    double getPrice(double price);
}

創(chuàng)建A、B、C、D四個(gè)具體策略角色(ConcreteStrategy):

import android.util.Log;

/**
 * ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
 * A類型客戶
 */

public class ConcreteStrategyA implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "A類型客戶,不打折");
        return price;
    }
}
import android.util.Log;

/**
 * ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
 * B類型客戶
 */

public class ConcreteStrategyB implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "B類型客戶,打九折");
        return price * 0.9;
    }
}
import android.util.Log;

/**
 * ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
 * C類型客戶
 */

public class ConcreteStrategyC implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "C類型客戶,打八折");
        return price * 0.8;
    }
}
import android.util.Log;

/**
 * ConcreteStrategy具體策略角色,實(shí)現(xiàn)抽象策略中的操作該類含有具體的算法
 * D類型客戶
 */

public class ConcreteStrategyD implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "D類型客戶,打七折");
        return price * 0.7;
    }
}

創(chuàng)建Context封裝角色:

/**
 * Context封裝角色,也叫作上下文角色,屏蔽高層模塊對(duì)策略、算法的直接訪問(wèn),封裝可能的變化。
 */

public class StrategyContext {

    private Strategy strategy;

    public StrategyContext(Strategy strategy) {
        this.strategy = strategy;
    }

    public double getPrice(double price) {
        return strategy.getPrice(price);
    }
}

調(diào)用:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

/**
 * 這是調(diào)用者
 */

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //假設(shè)客戶類型為C類客戶
        StrategyContext context = new StrategyContext(new ConcreteStrategyC());
        double price = context.getPrice(10000);
        Log.d("TAG", "報(bào)價(jià)為:" + price);
    }
}

結(jié)果:
image.png

已完成測(cè)試!有不對(duì)的地方歡迎指出,感恩。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文僅僅為入門(mén),高手勿噴。 實(shí)際工作中,我們總會(huì)遇到類似如下的需求:某支付系統(tǒng)接入以下幾種商戶進(jìn)行充值:易寶網(wǎng)易,...
    JarvanMo閱讀 14,371評(píng)論 14 26
  • 【學(xué)習(xí)難度:★☆☆☆☆,使用頻率:★★★★☆】直接出處:策略模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 1,633評(píng)論 3 5
  • javascript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐 設(shè)計(jì)模式 每個(gè)設(shè)計(jì)模式我們需要從三點(diǎn)問(wèn)題入手: 定義 作用 用法與實(shí)現(xiàn) 單...
    穿牛仔褲的蚊子閱讀 4,473評(píng)論 0 13
  • 本文旨在快速梳理常用的設(shè)計(jì)模式,了解每個(gè)模式主要針對(duì)的是哪些情況以及其基礎(chǔ)特征,每個(gè)模式前都有列舉出一個(gè)或多個(gè)可以...
    蠻三刀醬閱讀 1,900評(píng)論 0 1
  • 天上有星星,地上有你的身影,樹(shù)下有小草,月亮下白兔在搗仙藥,我的心里還有我與你分離的那一幕讓我傷心。我們?cè)?jīng)約定永...
    小妖淺淺閱讀 152評(píng)論 0 0

友情鏈接更多精彩內(nèi)容