CoffeeScript 策略模式

2022-06-29 17:16 更新

策略模式

問題

解決問題的方式有多種,但是你需要在程序運(yùn)行時(shí)選擇(或是轉(zhuǎn)換)這些方法。

解決方案

在策略對象(Strategy objects)中封裝你的算法。

例如,給定一個(gè)未排序的列表,我們可以在不同情況下改變排序算法。

基類

StringSorter = (algorithm) ->
    sort: (list) -> algorithm list

策略

bubbleSort = (list) ->
    anySwaps = false
    swapPass = ->
        for r in [0..list.length-2]
            if list[r] > list[r+1]
                anySwaps = true
                [list[r], list[r+1]] = [list[r+1], list[r]]

    swapPass()
    while anySwaps
        anySwaps = false
        swapPass()
    list

reverseBubbleSort = (list) ->
    anySwaps = false
    swapPass = ->
        for r in [list.length-1..1]
            if list[r] < list[r-1]
                anySwaps = true
                [list[r], list[r-1]] = [list[r-1], list[r]]

    swapPass()
    while anySwaps
        anySwaps = false
        swapPass()
    list

使用策略

sorter = new StringSorter bubbleSort

unsortedList = ['e', 'b', 'd', 'c', 'x', 'a']

sorter.sort unsortedList

# => ['a', 'b', 'c', 'd', 'e', 'x']

unsortedList.push 'w'

# => ['a', 'b', 'c', 'd', 'e', 'x', 'w']

sorter.algorithm = reverseBubbleSort

sorter.sort unsortedList

# => ['a', 'b', 'c', 'd', 'e', 'w', 'x']

討論

“沒有作戰(zhàn)計(jì)劃在第一次接觸敵人時(shí)便能存活下來。” 用戶如是,但是我們可以運(yùn)用從變化的情況中獲得的知識來做出適應(yīng)改變。在示例末尾,例如,數(shù)組中的最新項(xiàng)是亂序排列的,知道了這個(gè)細(xì)節(jié),我們便可以通過切換算法來加速排序,只要簡單地重賦值就可以了。

練習(xí)

  • 將StringSorter擴(kuò)展為AlwaysSortedArray類來實(shí)現(xiàn)規(guī)則序列的所有功能,但是要基于插入方法自動(dòng)分類新的項(xiàng)(例如push對比shift)。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號