【轉】GoF23種設計模式之行爲型模式之策略模式

1概述

        定義一系列算法,把它們一個個都封裝起來,並且讓它們可以相互替換。策略模式使得算法可以獨立於使用它的客戶而發生變化。

2適用性

(1)許多相關的類僅僅是行爲存在差異的時候。“策略”提供了一種使用多個行爲中的一個來配置一個類的方法。
(2)需要使用一個算法的不同變體的時候。
(3)算法使用了客戶不應該知道的數據的時候。以避免暴露覆雜的、與算法相關的數據結構。
(4)一個類定義了多種行爲,並且這些行爲在這個類的操作中以多個條件語句的形式出現的時候。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。    

3參與者

(1)Strategy:定義所有支持的算法的公共接口。Context使用這個接口來調用某個ConcreteStrategy定義的算法。
(2)ConcreteStrategy:實現Strategy接口的某種具體算法。
(3)Context:用一個ConcreteStrategy對象來配置。維護一個對Strategy對象的引用。可定義一個接口來讓Stategy訪問它的數據。

4類圖

5示例

Strategy
  1. package cn.lynn.strategy;  
  2.   
  3. public abstract class DBHelper {  
  4.   
  5.     public abstract void crud();  
  6.   
  7. }  
ConcreteStrategy
  1. package cn.lynn.strategy;  
  2.   
  3. public class JdbcTemplateImpl extends DBHelper {  
  4.   
  5.     @Override  
  6.     public void crud() {  
  7.         System.out.println("使用JDBC方式操作數據庫!");  
  8.     }  
  9.   
  10. }  
  1. package cn.lynn.strategy;  
  2.   
  3. public class HibernateFactoryImpl extends DBHelper {  
  4.   
  5.     @Override  
  6.     public void crud() {  
  7.         System.out.println("使用Hibernate持久化方式操作數據庫!");  
  8.     }  
  9.   
  10. }  
Context
  1. package cn.lynn.strategy;  
  2.   
  3. public class Context {  
  4.   
  5.     private DBHelper dbHelper;  
  6.   
  7.     public Context(DBHelper dbHelper) {  
  8.         this.dbHelper = dbHelper;  
  9.     }  
  10.       
  11.     public void execute() {  
  12.         dbHelper.crud();  
  13.     }  
  14. }  
Client
  1. package cn.lynn.strategy;  
  2.   
  3. public class Client {  
  4.   
  5.     public static void main(String[] args) {  
  6.         Context context = new Context(new JdbcTemplateImpl());  
  7.         context.execute();  
  8.         context = new Context(new HibernateFactoryImpl());  
  9.         context.execute();  
  10.     }  
  11.   
  12. }  
Result
  1. 使用JDBC方式操作數據庫!  
  2. 使用Hibernate持久化方式操作數據庫!  
發佈了184 篇原創文章 · 獲贊 11 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章