自分が見たデザインモデルに書く「戦略モデル」
20262 ワード
一連のアルゴリズムを定義し、それらを一つ一つカプセル化し、互いに置き換えることができます.
シーンシステム内に多くのクラスがあり、それらの違いはそれらの動作のみにある場合、ポリシーモードを使用して、1つのオブジェクトが多くの動作の中で1つの動作 を動的に選択することができる.システムは、いくつかのアルゴリズムの中で を動的に選択する必要がある.オブジェクトに多くの動作がある場合、適切なモードを使用しない場合、これらの動作は、 を実現するために複数の条件選択文を使用するしかない.
メリットアルゴリズムは を自由に切り替えることができる.多重条件判定の使用を避ける. 拡張性良好 欠点ポリシークラスは 増加します.すべてのポリシークラスは、 を外部に暴露する必要があります.
使用
シーン
メリット
使用
1.
/**
*
*
* @author dkangel
*/
public abstract class AbstractStrategy {
/**
*
*
* @param array
*/
public abstract void sort(int[] array);
public void printArray(int[] array) {
System.out.print("{ ");
for (int i : array) {
System.out.print(i + " ");
}
System.out.println("}");
}
}
2. 、
/**
*
*
* @author dkangel
*/
public class QuickStrategy extends AbstractStrategy {
@Override
public void sort(int[] array) {
System.out.println("use quick sort");
quickSort(array, 0, array.length - 1);
super.printArray(array);
}
/**
* : flag( ), , , , ,
* , , 。
* :O(nlogn)
* :
*
* @param a
* @param left leftIndex
* @param right rightIndex
*/
private void quickSort(int[] a, int left, int right) {
if (left < right) {
int flag = a[left];
int i = left;
int j = right;
do {
while (a[j] >= flag && j > i) {
j--;
}
if (a[j] < flag) {
int tmp = a[j];
a[j] = a[left];
a[left] = tmp;
}
while (a[i] <= flag && i < j) {
i++;
}
if (a[i] > flag) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
} while (i < j);
quickSort(a, left, i);
quickSort(a, i + 1, right);
}
}
}
/**
*
*
* @author dkangel
*/
public class BubbleStrategy extends AbstractStrategy {
@Override
public void sort(int[] array) {
System.out.println("use bubble sort.");
bubbleSort(array);
super.printArray(array);
}
/**
* : , , “ ” 。
* :O(n^2)
* :
*
* @param a
*/
private void bubbleSort(int[] a) {
int len = a.length;
for (int i = 0; i < len - 1; i++) {
// , , j len-1-i
for (int j = 0; j < len - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}
}
3. ,
/**
* , Client Strategy
*
* @author dkangel
*/
public class Context {
private AbstractStrategy abstractStrategy;
public Context(AbstractStrategy abstractStrategy) {
this.abstractStrategy = abstractStrategy;
}
public void executeStrategy(int[] arrays) {
abstractStrategy.sort(arrays);
}
}
4.
/**
*
*
* @author dkangel
*/
public class Main {
public static void main(String[] args) {
int[] array = new int[]{3, 1, 9, 5};
//
Context context = new Context(new QuickStrategy());
context.executeStrategy(array);
//
context = new Context(new BubbleStrategy());
context.executeStrategy(array);
}
}