當前位置:
首頁 > 知識 > 設計模式解密(3)-策略模式

設計模式解密(3)-策略模式

設計模式解密(3)-策略模式

1、簡介

定義:定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換。策略模式的決定權在用戶,系統本身提供不同演算法的實現,新增或者刪除演算法,對各種演算法做封裝。因此,策略模式多用在演算法決策系統中,外部用戶只需要決定用哪個演算法即可。

類型:行為類模式

2、實例引入

背景:模擬商城的促銷活動,旨在了解模式

先定義一個活動介面:

package com.designpattern.strategy;
/**
* 類說明 :促銷活動抽象介面
*/
public interface AbstractSaleActivity {

public void saleEvent;
}

定義3個具體的活動:

package com.designpattern.strategy;
/**
* 類說明 :定義具體的促銷活動 - 518活動
*/
public class SaleActivity618 implements AbstractSaleActivity {

@Override
public void saleEvent {
//TODO 業務邏輯
System.out.println("618促銷活動!");
}
}

package com.designpattern.strategy;
/**
* 類說明 :定義具體的促銷活動 - 1111活動
*/
public class SaleActivity1111 implements AbstractSaleActivity {

@Override
public void saleEvent {
// TODO 業務邏輯
System.out.println("雙十一促銷活動!");
}
}

package com.designpattern.strategy;
/**
* 類說明 :定義具體的促銷活動 - 1212活動
*/
public class SaleActivity1212 implements AbstractSaleActivity{

@Override
public void saleEvent {
// TODO 業務邏輯
System.out.println("雙十二促銷活動!");
}
}

定義活動入口:

package com.designpattern.strategy;
/**
* 類說明 :活動入口
*/
public class ActivityEntry {

public void activityEntry(String str){
AbstractSaleActivity saleActivity = null;
switch(str){
case "618":
saleActivity = new SaleActivity618;
saleActivity.saleEvent;
break;
case "1111":
saleActivity = new SaleActivity1111;
saleActivity.saleEvent;
break;
case "1212":
saleActivity = new SaleActivity1212;
saleActivity.saleEvent;
break;
default:
System.out.println("無具體活動!");break;
}
}
}

測試:

package com.designpattern.strategy;
/**
* 類說明 :測試
*/
public class Test {
public static void main(String[] args) {
//618活動
ActivityEntry activity = new ActivityEntry;
activity.activityEntry("618");

//1111活動
ActivityEntry activity1 = new ActivityEntry;
activity1.activityEntry("1111");

//1212活動
ActivityEntry activity2 = new ActivityEntry;
activity2.activityEntry("1212");
}
}

結果:

618促銷活動!
雙十一促銷活動!
雙十二促銷活動!

是不是對策略模式有一定了解了?

3、解決的問題

客戶端(調用者)可以根據條件來選擇不同的策略來解決不同的問題。

4、優缺點

優點:

策略類之間可以自由切換,由於策略類實現自同一個抽象,所以他們之間可以自由切換。

易於擴展,增加一個新的策略對策略模式來說非常容易,基本上可以在不改變原有代碼的基礎上進行擴展。

缺點:

維護各個策略類會給開發帶來額外開銷,隨著策略類的數量逐漸增多,就令人頭疼了。

必須對客戶端(調用者)暴露所有的策略類,因為使用哪種策略是由客戶端來決定的,因此,客戶端應該知道有什麼策略,並且了解各種策略之間的區別,否則,後果很嚴重。例如,有一個排序演算法的策略模式,提供了快速排序、冒泡排序、選擇排序這三種演算法,客戶端在使用這些演算法之前,是不是先要明白這三種演算法的適用情況?再比如,客戶端要使用一個容器,有鏈表實現的,也有數組實現的,客戶端是不是也要明白鏈表和數組有什麼區別?就這一點來說是有悖於迪米特法則的。

5、應用場景

幾個類的主要邏輯相同,只在部分邏輯的演算法和行為上稍有區別的情況。有幾種相似的行為,或者說演算法,客戶端需要動態地決定使用哪一種,那麼可以使用策略模式,將這些演算法封裝起來供客戶端調用。

6、總結

策略模式是一種簡單常用的模式,我們在進行開發的時候,會經常有意無意地使用它,一般來說,策略模式不會單獨使用,跟模版方法模式、工廠模式等混合使用的情況比較多。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

Backbone中父子view之間的值傳遞
Socket實現-Socket I/O
C++基礎之引用與指針的區別與聯繫、常引用使用時應注意的問題
Hugo快速搭建Blog

TAG:科技優家 |

您可能感興趣

設計模式概念
24種設計模式及案例
設計模式之代理模式
反射與代理設計模式-動態代理設計模式
拍攝模式之Auto模式及曝光程序模式
PS4 Pro《戰神》將提供性能模式和4K模式
《巫師2》X1X更新後 畫面模式vs幀數模式對比
淺談遊戲設計模式分析
《巫師2》Xbox1 X補丁強化 畫面模式和性能模式對比
PHP設計模式—服務定位器
雲巔h5兩大養成模式的修鍊系統分析
社交產品設計模式
深入理解單例模式 ( 下 )
P、A、S、M模式詳解丨你了解這四種拍攝模式么?
《戰地1》正式推出入侵遊戲模式 專註5v5競技
僅在PS4 Pro上 《戰神》將提供性能模式和4K模式
4.手機拍照優先、RAW模式、模塊化的問題
3.拍攝模式的布局
新型「聯合辦公」模式
設計模式之觀察者模式源碼分析及實踐