結合案例深刻解析策略模式

1、基本概念
策略模式是行爲型設計模式。算法

其用意是針對一組算法,將每個算法封裝到具備共同接口的獨立的類中,從而使得它們能夠相互替換。設計模式

策略模式使得算法能夠在不影響到客戶端的狀況下發生變化。併發

2、結構
下面是基本結構:框架

clipboard.png

三類角色:分佈式

環境(Context)角色:持有一個Strategy的引用。
抽象策略(Strategy)角色:這是一個抽象角色,一般由一個接口或抽象類實現。此角色給出全部的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行爲。
3、案例
案例實現:ide

定義一族算法,能夠實現對兩個數的操做,例如+、-、*、/等。
實現代碼總體框架圖:高併發

clipboard.png

具體代碼實現:測試

Context類:this

/**spa

  • Context 是一個使用了某種策略的類。 實現了 Strategy 接口的實體策略類

*/
public class Context {

private Strategy strategy;

public Context(Strategy strategy) {
    this.strategy = strategy;
}

public int executeStrategy(int num1, int num2){
    return strategy.doOperation(num1, num2);
}

}
Strategy接口:

/*策略的公共接口/
public interface Strategy {

int doOperation(int num1, int num2);

}
三種對應的算法實現:

/* 算法1: 實現加法 /
public class OperationAdd implements Strategy {

@Override
public int doOperation(int num1, int num2) {
    return num1 + num2;
}

}
/* 算法2:實現減法 /
public class OperationSubstract implements Strategy{

@Override
public int doOperation(int num1, int num2) {
    return num1 - num2;
}

}
/* 算法3: 實現乘法 /
public class OperationMultiply implements Strategy{

@Override
public int doOperation(int num1, int num2) {
    return num1 * num2;
}

}
測試類:

public class MyTest {

public static void main(String[] args) {

    Context context = new Context(new OperationAdd());

    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

    context = new Context(new OperationSubstract());
    System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

    context = new Context(new OperationMultiply());
    System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}

}
程序輸出:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
4、總結
策略模式的重心不是如何實現算法,而是如何組織、調用這些算法;
策略模式一個很大的特色就是各個策略算法的平等性。對於一系列具體的策略算法,你們的地位是徹底同樣的,正由於這個平等性,才能實現算法之間能夠相互替換;
使用策略模式能夠避免使用多重條件(if-else)語句;
免費Java高級資料須要本身領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G。
傳送門:https://mp.weixin.qq.com/s/Jz...

相關文章
相關標籤/搜索