定義一系列演算法,把它們一個個封裝起來,並且使他們可以互相替換。
通俗的講,實作同一個功能,有多種方法或策略。可以把這些方法或策略提取並封裝起來。需要使用哪一種方法,傳對應的物件進來就行。
1)定義一個策略接口,該接口定義若干抽象方法。
2)具體策略,實作策略接口,並實作接口中定義的方法。
3)封裝呼叫類,持有策略介面的參考。當使用者需要完成某項功能時,只要向這個類別傳入對應的策略對象,並呼叫方法即可。
以檔案的加密解密為例做說明。
1)策略接口,定義策略名稱
/** * 策略接口 */ public interface EncodeStrategy { /** * 加密算法 * @param file */ public abstract void encryptFile(File file); /** * 解密算法 * @param file * @return */ public abstract String decryptFile(File file); }
2)具體策略類別1
/** * 具体策略 */ public class AESEncode implements EncodeStrategy { @Override public void encryptFile(File file) { //省略具体细节 } @Override public String decryptFile(File file) { //省略具体细节 return null; } }
特定策略類別2
public class Base64Encode implements EncodeStrategy { @Override public void encryptFile(File file) { //省略具体细节 } @Override public String decryptFile(File file) { //省略具体细节 return null; } }
3)封裝呼叫類
/** * 封装调用类,需要用到具体策略,只需传入其对象即可 */ public class FileEncode{ /** * 策略接口的引用 */ EncodeStrategy strategy; public FileEncode(EncodeStrategy strategy){ this.strategy = strategy; } //根据传入的具体策略对象,调用其方法 public void encryptFile(File file) { strategy.encryptFile(file); } //根据传入的具体策略对象,调用其方法 public String decryptFile(File file) { return strategy.decryptFile(file); } }
4)測試程式碼
public class TestStrategy { public static void main(String args []){ File file = new File("d:\test.txt"); //调用策略1 实现加密 FileEncode fileEncode = new FileEncode(new AESEncode()); fileEncode.encryptFile(file); //调用策略2 实现加密 fileEncode = new FileEncode(new Base64Encode()); fileEncode.encryptFile(file); } }
以上是Java設計模式:策略模式及實作方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!