一,什麼是策略模式
Strategy 模式也叫策略模式是行爲模式之一,它對一系列的算法加以封裝,爲所有算法定義一個抽象的算法接口,並通過繼承該抽象算法接口對所有的算法加以封裝和實現,具體的算法選擇交由客戶端決定(策略)。Strategy 模式主要用來平滑地處理算法的切換。
二,策略模式的接口
三,策略模式的角色和職責,優點,缺點
Strategy : 策略(算法)抽象。
ConcreteStrategy :各種策略(算法) 的具體實現
Contenxt :策略的外部封裝類,或者說策略的容器類。根據不同策略執行不同的行爲。策略由外部環境決定。
優點:
1,策略模式提供了管理相關的算法的辦法。策略模式的等級結構定義了一個算法或行爲族,恰當使用繼承可以把公共的代碼移到父類裏面,從而避免重複的代碼。
2,策略模式提供了可以替換繼承關係的辦法。繼承可以處理多種算法或行爲。如果不是用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行爲。但是,這樣一來算法或採取哪一種行爲的邏輯就和算法或行爲的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態改變算法或行爲變得不可能。
3,使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護。它把採取哪一種算法或採取哪一種行爲的邏輯與算法或行爲的邏輯混合在一起。統統列在一個多重轉移語句裏面,比使用繼承的辦法還要原始和落後。
缺點:
1,客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道所有的算法或行爲的情況。
2,策略模式造成很多的策略類。有時候可以通過把依賴於環境的狀態保存到客戶端裏面,而將策略類設計成共享的,這樣策略類實例可以被不同的客戶端使用。換言之,可以使用亨元模式來減少對象的數量。
四:代碼的實現:
4.1 Strategy : 策略(算法)抽象。
/**
* @ClassName Strategy
* @Description TODO
* @Version 1.0
**/
public interface Strategy {
/**
* @Description: 加密
* @param:
* @return: void
**/
public void encrypt();
}
4.2 ConcreteStrategy :各種策略(算法) 的具體實現
/**
* @ClassName Md5Strategy
* @Description TODO
* @Version 1.0
**/
public class Md5Strategy implements Strategy {
/**
* @Description: 實現加密方法
* @param: []
* @return: void
**/
@Override
public void encrypt() {
System.out.println("執行Md5加密算法");
}
}
/**
* @ClassName Base64Srategy
* @Description TODO
* @Version 1.0
**/
public class Base64Srategy implements Strategy {
@Override
public void encrypt() {
System.out.println("執行Base64加密算法");
}
}
4.3 Context :策略的外部封裝類,或者說策略的容器類。根據不同策略執行不同的行爲。策略由外部環境決定。
/**
* @ClassName Context
* @Description TODO
* @Version 1.0
**/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void encrypt(){
this.strategy.encrypt();
}
}
4.4 結合簡單工廠模式 ,讓創建實例化的對象變得更加優雅
/**
* @ClassName StrategyCreator
* @Description 工廠類
* @Version 1.0
**/
public class StrategyFactory {
public static Context getContext(String type){
try {
Class strategy = Class.forName(type);
return new Context((Strategy) strategy.newInstance());
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("找不到對象");
}catch (InstantiationException e){
e.getMessage();
System.out.println("實例化錯誤");
}catch (IllegalAccessException e){
e.getMessage();
System.out.println("非法訪問異常");
}
return null;
}
}
4.5 測試
/**
* @ClassName Test
* @Description TODO
* @Version 1.0
**/
public class Test {
public static void main(String[] args) {
Context context = StrategyFactory.getContext("com.enjoy.Cap21.Md5Strategy");
context.encrypt();
}
}