策略模式(Strategy)(常用)

概念:
該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以相互替換,且算法的變化不會(huì)影響使用算法的客戶。其思想是針對(duì)一組算法,將每一種算法都封裝到具有共同接口的獨(dú)立的類中,從而是它們可以相互替換。策略模式的最大特點(diǎn)是使得算法可以在不影響客戶端的情況下發(fā)生變化,從而改變不同的功能。

舉例:
我們就以Java中的TreeSet為例,TreeSet僅僅知道它只是接收一個(gè)Comparator這種接口類型,但是具體是哪種實(shí)現(xiàn)類,TreeSet并不關(guān)心,實(shí)現(xiàn)類在真正的傳入TreeSet之前,TreeSet本身是不知道的,所以我們可以自己去實(shí)現(xiàn)Comparator接口,然后在實(shí)現(xiàn)類里面去封裝好我們自己的規(guī)則(這里的規(guī)則你可以當(dāng)做是算法),比如說(shuō)我們要實(shí)現(xiàn)對(duì)一個(gè)集合的元素排序,但是到底是要升序排序還是降序排序,這個(gè)完全由我們來(lái)去控制,我們可以把這種變化的內(nèi)容封裝到自己的實(shí)現(xiàn)類中,真正運(yùn)行的時(shí)候才知道具體的實(shí)現(xiàn)。

TreeSet

組成:

  • Strategy 抽象策略角色這個(gè)是一個(gè)抽象的角色,通常情況下使用接口或者抽象類去實(shí)現(xiàn)。對(duì)比來(lái)說(shuō),就是我們的Comparator接口。
  • Concrete Strategy 具體策略角色包裝了具體的算法和行為。對(duì)比來(lái)說(shuō),就是實(shí)現(xiàn)了Comparator接口的實(shí)現(xiàn)一組實(shí)現(xiàn)類。
  • Context 環(huán)境角色內(nèi)部會(huì)持有一個(gè)抽象角色的引用,給客戶端調(diào)用。對(duì)比來(lái)說(shuō),就是我們的TreeSet類。說(shuō)明:TreeSet內(nèi)部一定會(huì)有一個(gè)策略類的一個(gè)成員變量,這樣做的目的在于可以當(dāng)我們?cè)谌?chuàng)建TreeSet對(duì)象的時(shí)候,可以接收我們向TreeSet類中傳遞的具體的策略類。

編寫步驟:

  • 定義抽象策略角色(為策略對(duì)象定義一個(gè)公共的接口)
  • 編寫具體策略角色(實(shí)際上就是實(shí)現(xiàn)上面定義的公共接口)
  • 定義環(huán)境角色,內(nèi)部持有一個(gè)策略類的引用

結(jié)構(gòu)圖:

celue.gif

實(shí)現(xiàn)代碼:

public class StrategyPattern
{
    public static void main(String[] args)
    {
        Context c=new Context();
        Strategy s=new ConcreteStrategyA();
        c.setStrategy(s);
        c.strategyMethod();
        System.out.println("-----------------");
        s=new ConcreteStrategyB();
        c.setStrategy(s);
        c.strategyMethod();
    }
}
//抽象策略類
interface Strategy
{   
    public void strategyMethod();    //策略方法
}
//具體策略類A
class ConcreteStrategyA implements Strategy
{
    public void strategyMethod()
    {
        System.out.println("具體策略A的策略方法被訪問(wèn)!");
    }
}
//具體策略類B
class ConcreteStrategyB implements Strategy
{
  public void strategyMethod()
  {
      System.out.println("具體策略B的策略方法被訪問(wèn)!");
  }
}
//環(huán)境類
class Context
{
    private Strategy strategy;
    public Strategy getStrategy()
    {
        return strategy;
    }
    public void setStrategy(Strategy strategy)
    {
        this.strategy=strategy;
    }
    public void strategyMethod()
    {
        strategy.strategyMethod();
    }
}

例子:

  1. 定義抽象策略角色


    1.jpg
  2. 定義具體策略角色(本例子僅僅演示,只是定義加、減兩種具體策略)
    加法策略:


    2.jpg

減法策略:


3.jpg
  1. 環(huán)境角色


    4.jpg
  2. 測(cè)試類


    5.jpg
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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