Java設計模式——策略模式——方法多樣 排程靈活

pswyjz發表於2021-09-09

何為策略

策略,英文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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章