常用的排序演算法有選擇排序,插入排序,氣泡排序,快速排序,歸併排序,希爾排序,堆排序這7種。假設現在有7個陣列,他們分別需要用到這7種排序方式的其中乙個進行排序應該怎麼辦呢。最常見的辦法就是寫乙個這樣的工具類
/**
* created by hao on 2016/6/19.
*/public
class
sorthelper
/*** 插入排序
*@param array
*/public
static
void
insertsort(int array)
/*** 氣泡排序
*@param array
*/public
static
void
bubblesort(int array)
/*** 快速排序
*@param array
*/public
static
void
quicksort(int array)
/*** 歸併排序
*@param array
*/public
static
void
mergesort(int array)
/*** 希爾排序
*@param array
*/public
static
void
shellsort(int array)
/*** 堆排序
*@param array
*/public
static
void
heapsort(int array)
}
這種方式是可以滿足需求的,但是有個不太好的地方:如果我們現在新增了一種排序演算法怎麼辦呢?必須要修改sorthelper類中的**然後在其中再加一種排序方式,這是違反我們常說的開閉原則的,而且隨著排序演算法的逐漸增加,sorthelper也會變得更加臃腫。
下面我們引入正題,什麼是策略模式呢?策略模式模式就是定義一組演算法,將每個方法都封裝起來,並且使他們之間可以互換。以上面的排序演算法為例,我們可以將這些演算法都抽象出來,提供乙個統一的介面,每種排序演算法都去實現這個介面並在其中實現自己的排序演算法。當我們使用某種排序演算法的時候就可以直接傳入這個演算法的實現物件就可以了。下面我們還是用**實現一遍吧
首先定義乙個統一的介面
public
inte***ce sortstrategy
然後每種演算法都去實現這個介面
public
class
selectsort
implements
sortstrategy
}public
class
insertsort
implements
sortstrategy
}public
class
bubblesort
implements
sortstrategy
}public
class
mergesort
implements
sortstrategy
}public
class
shellsort
implements
sortstrategy
}public
class
heapsort
implements
sortstrategy
}public
class
quicksort
implements
sortstrategy
}
我們還需要乙個類去將這些類封裝一下方便呼叫
public
class sortoperator
public
void
operator(int array)
}
下面我們可以測試一下策略模式的效果
public
class test
}
執行後結果
這裡實現了快速排序
這裡實現了歸併排序
凡事有利必有弊,策略模式也一樣,策略模式封裝了底層的演算法,可以非常方便的進行拓展和維護。但相應的代價就是類檔案增多同時所有的策略類都需要對外暴露。
當你在學習多型的時候一定看過這樣的**
public
abstract
class
animal
public
class
dogextends
animal
}public
class
catextends
animal
}public
class
test
}
有沒有發現這跟策略模式簡直一毛一樣,策略模式本來就是採用了物件導向的繼承和多型機制,並沒有什麼難以理解的地方,難的往往是你如何才能在繁雜的業務邏輯**中抽離出策略介面。 策略模式之排序演算法
策略模式 strategy 它定義了演算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。排序介面 isort.h pragma once class isort virtual void dosort int a,int len 0 氣泡排序演算法類b...
資料結構 排序演算法(策略模式)
策略模式,以排序為例 inte ce strategy class quicksortstrategy strategy class bubblesortstrategy strategy if flag 括號裡預設為true的時候執行下面的 或者這麼寫也可flag false console.wr...
容器排序 策略模式
將比較的方法封裝到單獨的乙個類中,做到實體類和方法類分離。方法類實現comparator介面。在上一片部落格中,是用氣泡排序法進行排序,在實際的應用中,我們直接呼叫collections類中的sort方法即可,具體請看jdk幫助文件。1 package hl7 11 23 import j a.ut...