設計模式解密(3)-策略模式
定義:定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換。策略模式的決定權在用戶,系統本身提供不同演算法的實現,新增或者刪除演算法,對各種演算法做封裝。因此,策略模式多用在演算法決策系統中,外部用戶只需要決定用哪個演算法即可。
類型:行為類模式
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.拍攝模式的布局
※新型「聯合辦公」模式
※設計模式之觀察者模式源碼分析及實踐