Java設計模式——策略模式——方法多樣 排程靈活
何為策略
策略,英文strategy,音標[ˈstrætədʒi]
,來來來,此處read after me大聲讀三遍,什麼重音、清子音、濁子音我都玩的有模有樣,十分優秀吭。
策略就是方法,辦法,方針,計謀差不多的意思,策略模式就如把三十六計匯聚成一本書,一塊研究管理,不然的話如此多的策略,打起仗來臨時抱佛腳也不知道該去哪裡抱啊。
所以策略模式就是把策略歸置好,並且透過一個集中的環境去讀取後使用。例如三十六計,就是把三十六中計謀集中歸置到書本(集中的環境)中,代後人調閱,也不用管後人到底是古代人,還是現代人,還是中國人,還是外國人,就是這麼牛X吭。
舉個例子
光說不練是假把式,手中必須有栗子才是真本事,此處我們舉個現實的程式設計例項。
比如現在我們有很多種數字加密演算法,我們應該把這些不同的演算法(策略)封裝起來,後續不管是網頁呼叫也好,是APP呼叫也好都可以直接拿過來使用。所以此處就是一個比較標準的策略模式使用場景。
抽象策略
首先分析下我們的策略是什麼樣的策略,實際上就是對數字加密,因此封裝一個介面IEncryptStrategy,注意這個命令中I表示這是一個介面,Encrypt表示加密,Strategy表示策略,綜合起來講,這是一個加密策略的介面。程式碼如下:
package org.demo.strategy;
/**
* @theme 加密策略介面
* @author maoge
* @date 2019-12-10
*/
public interface IEncryptStrategy {
/**
* 對一個數字進行加密
*/
public double encrypt(double input);
}
具體策略
抽象策略是為了定義一個標準,只有符合標準的才能納入該類策略,比如此處必須是能對數字加密的策略才行,此處我們實現兩個牛X的加密演算法,穩!
package org.demo.strategy;
/**
* @theme 加法加密策略
* @author maoge
* @date 2019-12-10
*/
public class AddEncryptStrategy implements IEncryptStrategy {
/**
* 將原來的值先+1,再加3,再+2,如此複雜的加密演算法,一般人想不到哈
*/
@Override
public double encrypt(double input) {
return input + 1 + 3 + 2;
}
}
package org.demo.strategy;
/**
* @theme 乘法加密策略
* @author maoge
* @date 2019-12-10
*/
public class MultiplyEncryptStrategy implements IEncryptStrategy {
/**
* 乘法加密——為高階加密演算法代言
*/
@Override
public double encrypt(double input) {
return input * 10;
}
}
呼叫環境
策略有了之後,最好放在一個統一的管理環境中,便於靈活排程。就好比要查詢計謀可去看《三十六計》書,要呼叫加密演算法就使用加密演算法上下文環境。
package org.demo.strategy;
/**
* @theme 加密演算法上下文環境
* @author maoge
* @date 2019-12-10
*/
public class EncryptContext {
/**
* 可儲存任意策略
*/
private IEncryptStrategy strategy;
public EncryptContext(IEncryptStrategy strategy) {
this.strategy = strategy;
}
/**
* 呼叫儲存的策略
*/
public double encrypt(double input) {
return strategy.encrypt(input);
}
}
呼叫示例
package org.demo.strategy;
/**
* 常規呼叫例項
*/
public class NormalUseStrategy {
public static void main(String[] args) {
EncryptContext context = new EncryptContext(new AddEncryptStrategy());
System.out.println("加法策略:" + context.encrypt(1));
context = new EncryptContext(new MultiplyEncryptStrategy());
System.out.println("乘法策略:" + context.encrypt(1));
}
}
藉助列舉與工廠模式規範呼叫
上面的呼叫示例對策略生成的管理太隨意了,我們可以藉助列舉和工廠模式來規範之,程式碼如下:
加密方法列舉:
package org.demo.strategy;
public enum EncryptStrategyEnum {
ADD, MULTIPLY;
}
工廠模式的環境類:
package org.demo.strategy;
/**
* @theme 加密演算法上下文環境
* @author maoge
* @date 2019-12-10
*/
public class EncryptContext {
/**
* 可儲存任意策略
*/
private IEncryptStrategy strategy;
/**
* 根據列舉生成策略
*/
public EncryptContext(EncryptStrategyEnum encryptStrategyEnum) {
if (encryptStrategyEnum == EncryptStrategyEnum.ADD) {
strategy = new AddEncryptStrategy();
} else {
strategy = new MultiplyEncryptStrategy();
}
}
/**
* 呼叫儲存的策略
*/
public double encrypt(double input) {
return strategy.encrypt(input);
}
}
呼叫示例:
package org.demo.strategy;
/**
* 呼叫例項
*/
public class Demo {
public static void main(String[] args) {
EncryptContext context = new EncryptContext(EncryptStrategyEnum.ADD);
System.out.println("加法策略:" + context.encrypt(1));
context = new EncryptContext(EncryptStrategyEnum.MULTIPLY);
System.out.println("乘法策略:" + context.encrypt(1));
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/755/viewspace-2824463/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java設計模式——觀察者模式的靈活應用Java設計模式
- JAVA設計模式之策略模式Java設計模式
- Java設計模式-策略模式分析Java設計模式
- Java設計模式6:策略模式Java設計模式
- Flink排程之排程器、排程策略、排程模式模式
- Java設計模式之策略模式示例Java設計模式
- Java設計模式之(十四)——策略模式Java設計模式
- 我的Java設計模式-策略模式Java設計模式
- Java設計模式之策略模式(Strategy)Java設計模式
- 【java設計模式】(7)---策略模式(案例解析)Java設計模式
- Java設計模式之策略模式詳解Java設計模式
- 設計模式——策略模式設計模式
- 設計模式(策略模式)設計模式
- 設計模式-策略模式設計模式
- 設計模式🔫---策略模式設計模式
- Java設計模式-模板方法模式Java設計模式
- java靈活傳參之builder模式JavaUI模式
- Java設計模式實現之二--策略模式Java設計模式
- Java設計模式(工廠方法設計模式)Java設計模式
- 從零開始單排學設計模式「策略模式」黑鐵 II設計模式
- 設計模式之策略模式設計模式
- js設計模式--策略模式JS設計模式
- 小白設計模式:策略模式設計模式
- 設計模式之【策略模式】設計模式
- 設計模式(一) 策略模式設計模式
- php設計模式–策略模式PHP設計模式
- 設計模式(八)——策略模式設計模式
- 設計模式(四):策略模式設計模式
- 設計模式-策略模式(轉)設計模式
- 【設計模式之策略模式】設計模式
- java設計模式-工廠方法模式Java設計模式
- 設計模式 #5 (策略模式、代理模式)設計模式
- 在Java服務端實現策略模式:如何靈活應對業務邏輯的多變性Java服務端模式
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- PHP 設計模式之策略模式PHP設計模式
- 設計模式(一) 支付策略模式設計模式
- JavaScript 設計模式之策略模式JavaScript設計模式
- 設計模式專題-策略模式設計模式