面試阿里被問到Java設計模式之策略模式,我不想多說,直接給她整的明明白白!!!

生活中我們去超市購物可以選擇不同促銷價格的商品,去旅遊可以選擇可以坐汽車、可以坐火車、可以坐飛機。

1,什麼是策略模式?

策略模式,就是定義了不同的算法族,並且之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。

2,策略模式有什麼好處?

策略模式的好處在於你可以動態的改變對象的行爲。

3,設計原則

設計原則是把一個類中經常改變或者將來可能改變的部分提取出來,作爲一個接口(c++中可以用虛類),然後在類中包含這個對象的實例,這樣類的實例在運行時就可以隨意調用實現了這個接口的類的行爲。【參考文獻】

策略模式屬於對象行爲型模式,主要針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響 到客戶端的情況下發生變化。通常,策略模式適用於當一個應用程序需要實現一種特定的服務或者功能,而且該程序有多種實現方式時使用。

策略模式:定義一系列的算法,把它們一個個封裝起來, 並且使它們可相互替換

策略模式具體角色實現

  • 抽象策略(Strategy)類:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
  • 具體策略(Concrete Strategy)類:實現了抽象策略定義的接口,提供具體的算法實現或行爲。
  • 環境(Context)類:持有一個策略類的引用,最終給客戶端調用。

1.創建一個接口

public interface Strategy {
    void show();
}

2.創建實現接口的實體類

public class StrategyA  implements Strategy{
    @Override
    public void show() {
        System.out.println("滿300-40");
    }
}//加入Java開發交流君樣:593142328一起吹水聊天

public class StrategyB implements  Strategy{
    @Override
    public void show() {
        System.out.println("滿500打8折");
    }
}

public class StrategyC implements  Strategy{
    @Override
    public void show() {
        System.out.println("買一送一");
    }
}

3.創建 Context類

public class Context {
    private Strategy strategy;

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

    public  void  ContextShow()
    {
        strategy.show();
    }
}
//加入Java開發交流君樣:593142328一起吹水聊天

使用 Context 來查看當它改變策略 Strategy 時的行爲變化

public static void main(String[] args) {
 Context context=new Context(new StrategyA());
 context.ContextShow();
}

策略模式實現

以淘寶618促銷爲例使用策略模式實現促銷打折場景

商品滿300-40,打八折,正常收費

1.聲明收費接口

public interface Cash{
    double Calculation(double money);
}

2.聲明上下文類

public class Context {
    private Cash cash;

    public  Context(Cash cash)
    {
        this.cash=cash;
    }

    public  double  ContextShow(double money)
    {
       return cash.Calculation(money);
    }
}

3.聲明正常收費子類

public class CashNormal  implements Cash{
    @Override
    public double Calculation(double money) {
        double total=0;
        total=money;
        System.out.println("正常收費,金額"+total);
        return total;
    }
}

4.聲明打折類

public class CashDiscount implements  Cash{

    private double disCount;
    public  CashDiscount(double disCount)
    {
        this.disCount=disCount;
    }

    @Override
    public double Calculation(double money) {
        double total=0;
        total=money*disCount;
        System.out.println("參加打"+disCount+"折活動,金額"+total);
        return total;
    }
}

5.聲明滿減類

public class CashFullreduction implements  Cash{
    //滿減金額
    private  double moneyReturn;
    //滿減門檻
    private  double moneyConditation;

    public  CashFullreduction(double moneyReturn,double moneyConditation)
    {
        this.moneyConditation=moneyConditation;
        this.moneyReturn=moneyReturn;
    }

    @Override
    public double Calculation(double money) {
        double total=0;
        if(money<300){//如果金額小於300,不滿減
            total=money;//加入Java開發交流君樣:593142328一起吹水聊天
        }
        else
        {
             total= money-(Math.floor(money/moneyConditation)*moneyReturn);
        }
        System.out.println("支付"+money+"元,滿"+moneyConditation+"減"+moneyReturn+",最後金額爲"+total);
        return  total;
    }
}

6.客戶端

public static void main(String[] args) {
    Context context=new Context(new CashFullreduction(40,300));//滿300-40
    context.ContextShow(400);
    Context context2=new Context(new CashDiscount(0.8));//打八折
    context2.ContextShow(400);
    Context context3=new Context(new CashNormal());//正常收費
    context3.ContextShow(400);
}

總結

1.優點

  • 策略類之間可以自由切換

    由於策略類都實現同一個接口,所以使它們之間可以自由切換。

  • 易於擴展

    增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼,符合“開閉原則“

  • 避免使用多重條件選擇語句(if else),充分體現面向對象設計思想。【白嫖資料】

2.缺點:

  • 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。
  • 策略模式將造成產生很多策略類,可以通過使用享元模式在一定程度上減少對象的數量。

使用場景:

1、如果在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式可以動態地讓一個對象在許多行爲中選擇一種行爲

2、一個系統需要動態地在幾種算法中選擇一種

3、如果一個對象有很多的行爲,如果不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現

最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峯。

可以的話請給我一個三連支持一下我喲??????【白嫖資料】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章