1. 程式人生 > >java 策略設計模式 --- 介面應用

java 策略設計模式 --- 介面應用

       策略模式:定義一系列的演算法,將每一種演算法封裝起來,並可以相互替換使用,策略模式讓演算法獨立於使用它的客戶應用而獨立變化。

    在生活中,假如我們有一堆資料需要儲存,可能儲存為檔案,可能儲存帶資料庫,也可能儲存到網上。我們平常的想法是定義一些列類,每次使用哪個儲存方法,就新建一個新的物件,來呼叫方法。這樣的話既費時又費力,方法多次重寫,還增加了類與類之間的耦合性。 不利於我們的開發。

    我可以把所有相似的類的共同可變的行為抽象出來,定義一系列的演算法,獨立出來,脫離使用者,繫結介面,方便使用和擴充套件

OO設計原則:

  1. 面向介面程式設計
  2. 封裝變化
  3. 多用組合,少用繼承

程式碼例項:

  1. 首先定義一個介面,建立一個儲存的抽象方法
public interface ISave {
	public void save(String data);
}
  1. 定義一系列的演算法,來完成相似的功能
public class NetSave implements ISave{
	public void save(String data) {
		System.out.println("正在把資料存到網上"+data);
	}
}
public class FileSave implements ISave{
	public void save(String data)
{ System.out.println("正在把資料存到檔案中"+data); } }
public class SqlSave implements ISave{
	public void save(String data) {
		System.out.println("正在把資料儲存到資料庫"+data);
	}
}
  1. 新建一個儲存的類,本類與要儲存什麼檔案無關,與組合的是什麼介面無關,為物件呼叫介面的功能做轉換。
/**
* 象類,組合了一個介面,給出設定介面的一個方法,和儲存的方法
*/
public abstract class BaseService {
	private
ISave iSave; //組合一個介面,作為本類的屬性 public void setISave(ISave iSave) { this.iSave = iSave; } public void add(String data) { System.out.println("正在檢查資料..."); iSave.save(data); System.out.println("資料儲存完畢。"); } }
//具體的類,可以根據業務要求,新增不同的功能
public class UserService extends BaseService{}
  1. 測試類,檢視策略模式的實現
public class Test {

	public static void main(String[] args) {
		/*
		 *   多型形式的例項化物件
		 */
		BaseService user = new UserService();
		user.setISave(new FileSave());
		user.add("mydata");
		
		user.setISave(new NetSave());
		user.add("data");
		
		user.setISave(new SqlSave());
		user.add("aaaa");
	}
}

結果如下: 在這裡插入圖片描述

看完程式碼再去回顧一下策略設計模式的定義,是不是又有新的體會呢?

對於我的抽象類或者UserService類來說,你是把資料儲存到檔案中,還是儲存到網路上來說,完全沒有關係了。只是儲存了介面,對於介面是誰,我也不關心。

策略模式的優點:

● 演算法可以自由切換 這是策略模式本身定義的,只要實現抽象策略,它就成為策略家族的一個成員,通過封裝角色對其進行封裝,保證對外提供“可自由切換”的策略。

● 避免使用多重條件判斷 如果沒有策略模式,我們想想看會是什麼樣子?一個策略家族有5個策略演算法,一會要使用A策略,一會要使用 B策略,怎麼設計呢?使用多重的條件語句?多重條件語句不易維護,而且出錯的概率大大增強。使用策略模式後,可以由其他模組決定採用何種策略,策略家族對外提供的訪問介面就是封裝類,簡化了操作,同時避免了條件語句判斷。

● 擴充套件性良好 這甚至都不用說是它的優點,因為它太明顯了。在現有的系統中增加一個策略太容易了,只要實現介面就可以了,其他都不用修改,類似於一個可反覆拆卸的外掛,這大大地符合了OCP原則。

策略模式的缺點: ● 策略類數量增多 每一個策略都是一個類,複用的可能性很小,類數量增多。 ● 所有的策略類都需要對外暴露 策略模式的使用場景: ● 多個類只有在演算法或行為上稍有不同的場景。 ● 演算法需要自由切換的場景。 ● 需要遮蔽演算法規則的場景。