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

一. 核心思想

策略模式定義了一系列算法,并將每一個(gè)算法封裝起來(lái),他們之間可以相互切換。

解釋: 同級(jí)的東西可以互相切換.
例如: 現(xiàn)在主流的圖片框架有g(shù)lide、picasso、fresco, 我項(xiàng)目中用的是picasso, 但是我突然想換成glide, 或者后面出來(lái)一個(gè)更牛逼的框架XXX, 代碼要怎么寫(xiě)才能實(shí)現(xiàn)輕松轉(zhuǎn)換呢? 用策略模式就能輕松解決.

二. 簡(jiǎn)單實(shí)現(xiàn)

下面我們以計(jì)算不同交通工具的車(chē)費(fèi)來(lái)簡(jiǎn)單看看策略模式的實(shí)現(xiàn)

public interface IStragety {
    /**
     * 根據(jù)公里數(shù)計(jì)算價(jià)格
     * @param km 公里數(shù)
     * @return 價(jià)格
     */
    int getPrice(int km);
}

public class StragetyA implements IStragety {
    @Override
    public int getPrice(int km) {
        return km + 10;
    }
}

public class StragetyB implements IStragety {
    @Override
    public int getPrice(int km) {
        return km + 20;
    }
}
public class ContextStragety {

    private IStragety mStragety;
    
    public void setStragety(IStragety stragety) {
        mStragety = stragety;
    }
    
    public int price(int km) {
        return mStragety.getPrice(km);
    }
}

使用

        ContextStragety contextStragety = new ContextStragety();
//        trafficCalculator.setCalculateStragety(new StragetyA());
        contextStragety.setStragety(new StragetyB());
        int price = contextStragety.calculatePrice(66);
        System.out.print("price="+price);

算法可以隨意切換, 符合里氏替換原則.
如果要增加一個(gè)算法, 只需新增一個(gè)子類(lèi)即可, 符合開(kāi)閉原則.

三. 角色劃分

1. 策略的抽象 IStragety
2. 具體的策略實(shí)現(xiàn) StragetyA 和 StragetyB
3. 用來(lái)操作策略的上下文環(huán)境 ContextStragety

四. 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):
① 很好地展示了開(kāi)閉原則里氏替換原則,
② 算法可以自由切換
③ 避免使用多重條件判斷
④ 耦合低, 擴(kuò)展性良好

缺點(diǎn):
① 隨著策略的增加, 子類(lèi)會(huì)越來(lái)越多
② 所有策略類(lèi)都需要對(duì)外暴露, 也就是"白盒子".

五. 應(yīng)用場(chǎng)景

一個(gè)對(duì)象動(dòng)態(tài)地在幾種算法中選擇一種時(shí)

1. android源碼中.
Animation中的插值器

 Animation animation = new AlphaAnimation(1,0);
 animation.setInterpolator(new AccelerateDecelerateInterpolator());

2. Java中Comparator.
對(duì)象排序功能實(shí)現(xiàn)

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
 }


public class SortComparator implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        //忽略具體實(shí)現(xiàn)
        return 1;
    }
}

使用

public static void main(String[] args) {

        Student stu[] = {
                new Student("張三" ,23),
                new Student("李四" ,26)};
        Arrays.sort(stu,new SortComparator());
        System.out.println(Arrays.toString(stu));

        List<Student> list = new ArrayList<>(3);
        list.add( new Student("zhangsan" ,31));
        list.add( new Student("lisi" ,30));
        Collections.sort(list,new SortComparator());
        System.out.println(list);

    }

只要思想不變, 代碼寫(xiě)法可以隨意改變, 能解決問(wèn)題就OK.

最后編輯于
?著作權(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)容

  • 本文的主要內(nèi)容: 介紹策略模式 示例商場(chǎng)購(gòu)物打折策略的實(shí)現(xiàn) 策略模式總結(jié) 源碼分析策略模式的典型應(yīng)用Java Co...
    小旋鋒的簡(jiǎn)書(shū)閱讀 1,493評(píng)論 0 1
  • 【學(xué)習(xí)難度:★☆☆☆☆,使用頻率:★★★★☆】直接出處:策略模式梳理和學(xué)習(xí):https://github.com/...
    BruceOuyang閱讀 1,642評(píng)論 3 5
  • 1.初識(shí)策略模式 定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶(hù)...
    王偵閱讀 1,550評(píng)論 0 3
  • 二十三種設(shè)計(jì)模式 - 策略模式 策略模式簡(jiǎn)介 模式動(dòng)機(jī) 完成一項(xiàng)任務(wù),往往可以有多種不同的方式,每一種方式稱(chēng)為一個(gè)...
    JustTheSame閱讀 1,905評(píng)論 2 16
  • 本文僅僅為入門(mén),高手勿噴。 實(shí)際工作中,我們總會(huì)遇到類(lèi)似如下的需求:某支付系統(tǒng)接入以下幾種商戶(hù)進(jìn)行充值:易寶網(wǎng)易,...
    JarvanMo閱讀 14,382評(píng)論 14 26

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