【設(shè)計(jì)模式】之策略模式

策略模式

策略模式屬于行為模式,可以在運(yùn)行時(shí)不修改類(lèi)本身而通過(guò)變更內(nèi)部算法來(lái)處理類(lèi)的行為變更。這允許對(duì)象的可擴(kuò)展性和松耦合性。
經(jīng)典定義如下:

定義一系列封裝的算法,可以交換這些算法來(lái)執(zhí)行特定的行為。

用例

解壓軟件例如 WinZip,提供了不同的算法去處理 gip、gzip、tar、jar、7zip格式。
在運(yùn)行時(shí),客戶(hù)端選擇了要執(zhí)行的算法類(lèi)型。
Email 客戶(hù)端像 outlook 支持很多類(lèi)型的郵件類(lèi)型例如 HTML 類(lèi)型。允許客戶(hù)端選擇 email 格式。

策略模式是怎樣工作的?

策略模式是簡(jiǎn)單而流行的模式,經(jīng)常與狀態(tài)模式一起使用。
以下是創(chuàng)建策略設(shè)計(jì)模式的步驟:

  • 1.為你的策略對(duì)象實(shí)現(xiàn)一個(gè)策略接口,這個(gè)接口定義了策略對(duì)象的行為。
  • 2.實(shí)現(xiàn)具體的策略類(lèi)(實(shí)現(xiàn)了 定義了上述步驟的策略接口)
  • 3.創(chuàng)建一個(gè)上下文類(lèi),并且維護(hù)策略對(duì)象的引用。創(chuàng)建getter、setter方法,允許訪問(wèn)策略對(duì)象。

策略模式示例

我們來(lái)看一個(gè)示例,演示多種不同的排序算法例如插入排序、選擇排序、歸并排序等。允許客戶(hù)端選擇他們喜歡的排序類(lèi)型。
類(lèi)圖如下:

策略模式類(lèi)圖

public interface SortingStrategy {

public void sort(int[] numbers);

}


#### SelectionSort.java

```java
public class SelectionSort implements SortingStrategy {

    @Override
    public void sort(int[] numbers) {
        System.out.println("Selection Sort!");

        int i, j, first, temp;
        for (i = numbers.length - 1; i > 0; i--) {
            first = 0;
            for (j = 1; j <= i; j++) {
                if (numbers[j] > numbers[first])
                    first = j;
            }
            temp = numbers[first];
            numbers[first] = numbers[i];
            numbers[i] = temp;
        }
        
        System.out.println(Arrays.toString(numbers));
    }
}

InsertionSort.java

public class InsertionSort implements SortingStrategy {

    @Override
    public void sort(int[] numbers) {
        System.out.println("Insertion Sort!");

        for (int i = 1; i < numbers.length; i++) {
            int temp = numbers[i];
            int j;
            for (j = i - 1; (j >= 0) && (numbers[j] > temp); j--) {
                numbers[j + 1] = numbers[j];
            }
            numbers[j + 1] = temp;
        }

        System.out.println(Arrays.toString(numbers));
    }
}

SortingContext.java

public class SortingContext {
    
    private SortingStrategy strategy;
    
    public void setSortingMethod(SortingStrategy strategy) {
        this.strategy = strategy;
    }
    
    public SortingStrategy getStrategy() {
        return strategy;
    }
    
    public void sortNumbers(int[] numbers){
        strategy.sort(numbers);
    }
}

?著作權(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)容

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時(shí)需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,878評(píng)論 0 14
  • 前言:本文主要介紹設(shè)計(jì)模式中的策略模式,準(zhǔn)備按照以下幾個(gè)方面展開(kāi): 什么是策略模式 策略模式結(jié)構(gòu)和UML圖 策略模...
    大數(shù)據(jù)Zone閱讀 2,233評(píng)論 1 6
  • 優(yōu)點(diǎn): 1、 策略模式提供了管理相關(guān)的算法族的辦法。策略類(lèi)的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共...
    修羅掌柜閱讀 419評(píng)論 0 1
  • 昨晚是第二次來(lái)光高做義工查寢室。七點(diǎn)多一點(diǎn)就到了學(xué)校。這一次學(xué)乖了,先到食堂吃點(diǎn)宵夜填飽肚子。第一次來(lái)光高查...
    仔細(xì)過(guò)日子閱讀 241評(píng)論 0 0
  • 最近發(fā)現(xiàn)一個(gè)秘密,常常有人說(shuō)壓力好大,學(xué)生面對(duì)考試,覺(jué)得壓力山大,大人們面對(duì)生活,覺(jué)得排山倒海,大伙都覺(jué)得喘不過(guò)氣...
    馬可約伯閱讀 342評(píng)論 0 1

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