設計模式——策略模式

2020-12-13 竇你玩小陶

設計模式——策略模式

1. 簡單工廠實現

面向對象的編程,並不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類。

2. 策略模式

策略這個詞應該怎麼理解,打個比方說,我們出門的時候會選擇不同的出行方式,比如騎自行車、坐公交、坐火車、坐飛機、坐火箭等等,這些出行方式,每一種都是一個策略。

再比如我們去逛商場,商場現在正在搞活動,有打折的、有滿減的、有返利的等等,其實不管商場如何進行促銷,說到底都是一些算法,這些算法本身只是一種策略,並且這些算法是隨時都可能互相替換的,比如針對同一件商品,今天打八折、明天滿100減30,這些策略間是可以互換的。

策略模式(Strategy):它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。

策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少了各種算法類與使用算法類之間的耦合。

策略模式的策略類(Strategy)類層次為上下文(Context)定義了一系列的可供重用的算法或行為。繼承有助於析取出這些算法中的公共功能。

策略模式的優點是簡化了單元測試,因為每個算法都有自己的類,可以通過自己的接口單獨測試。

當不同的行為堆砌在一個類中時,就很難避免使用條件語句來選擇合適的行為。將這些行為封裝在一個獨立的Strategy類中,可以在使用這些行為的類中消除條件語句。

策略模式就是用來封裝算法的,但在實踐中,我們發現可以用它來封裝幾乎任何類型的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。

策略模式和簡單工廠模式的區別:

簡單工廠模式:只需要發出命令,由他人去實現。

策略模式:不知要發出命令,還得由自己親自去做。

3. 策略模式的應用

1). 何時使用:一個系統有許多類,而區分它們的只是他們直接的行為時

2). 方法:將這些算法封裝成一個一個的類,任意的替換

3). 優點:算法可以自由切換避免使用多重條件判斷(如果不用策略模式我們可能會使用多重條件語句,不利於維護)擴展性良好,增加一個策略只需實現接口即可

4). 缺點:策略類數量會增多,每個策略都是一個類,復用的可能性很小所有的策略類都需要對外暴露

5). 使用場景:多個類只有算法或行為上稍有不同的場景算法需要自由切換的場景需要屏蔽算法規則的場景

6). 應用實例:出行方式,自行車、汽車等,每一種出行方式都是一個策略商場促銷方式,打折、滿減等Java AWT中的LayoutManager,即布局管理器

7). 注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式來解決策略類膨脹的問題

4. 應用場景實例

(1)假設現在要設計一個販賣各類書籍的電子商務網站的購物車系統。一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這要複雜。比如,本網站可能對所有的高級會員提供每本20%的促銷折扣;對中級會員提供每本10%的促銷折扣;對初級會員沒有折扣。

根據描述,折扣是根據以下的幾個算法中的一個進行的:

算法一:對初級會員沒有折扣。

算法二:對中級會員提供10%的促銷折扣。

算法三:對高級會員提供20%的促銷折扣。

抽象折扣類:

初級會員折扣類:

中級會員折扣類:

高級會員折扣類:

價格類:

調用:

(2)商城收銀軟體,營業員根據客戶所購買商品的單價和數量,向客戶收費。現在商場對商品搞活動,所有的商品對應不同的情況打八折、七折、五折,並且滿300返100、滿200返50。商場增加促銷手段,滿100積分10點,以後積分累積到一定數量可以兌換獎品。

CashContext類:

Class CashContext{

//聲明一個CashSuper對象

CashSuper cs = null;

//注意參數不是具體的收費策略對象,而是一個字符串,表示收費類型

public CashContext(String type){

//簡單工廠應用

switch(type){

case "正常收費":

CashNormal cs0 = new CashNormal();

cs = cs0;

break;

case "滿300返100":

CashReturn cr1 = new CashReturn ("300", "100");

cs = cr1;

break;

case "打8折";

CashRebate cr2 = new CashRebate("0.8");

cs = cr2;

break;

}

}

public double GetResult(double money){

return cs.acceptCash(money);

}

}

客戶端代碼(主要部分):

double total = 0.0d;

private void btnOk_Click(object sender, EventArgs e){

//將相應的算法類型字符串傳入CashContext的對象中

CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());

……

}

相關焦點

  • 設計模式之策略模式
    行為型設計模式策略模式一簡介當一個對象有多種行為要執行時,我們可以使用策略模式,讓對象自由選擇執行的行為種類,避免使用if…else if….else if…這種嵌套代碼如果我們使用策略模式,某個行為要修改代碼,我們只要修改對應行為的類,都不用動到舊代碼。後期如果要撤掉某種行為或增加某種行為,都比較方便。二例子假設系統維護裡,會發送命令:分析系統cpu使用情況,分析系統memory使用情況,分析系統io情況。後端系統執行命令後,將結果傳回前端,供界面展示結果,畫趨勢圖。
  • Java設計模式之策略模式詳解
    前言在軟體領域中,設計模式作為一種經典的開發實踐常常需要我們去深入的理解,而策略模式作為設計模式的一種,使用頻率也是相對來說比較高的,在Java中,當我們學習TreeSet集合的時候,就採用了經典的策略模式的思想,本文主要講解策略模式。
  • 設計模式之策略模式(Java實現例子說明)
    設計模式之策略模式小王在和同事正在吹牛時,領導過來了,小王啊,你又在吹牛了?別吹了,幹點正活,下周要去春遊,你給出幾種方案。小王一聽去旅遊,屁顛屁顛地去幹活了。這個其實就是一個設計模式,叫做策略模式。策略模式(Strategy Pattern):定義一組算法,將每個算法封裝起來,並且使他們之間可以互換。策略模式是一個簡單的模式也叫做政策模式。
  • 教學設計的模式和教學策略的分類
    教學設計過程的模式則是在教學設計的實踐當中逐漸形成的,運用系統方法進行教學開發、設計的理論的簡化形式。教學設計的一般模式是適合於多種設計類型的教學模式,需要找到教學設計的基本組成部分。教學設計者在教學設計實踐的基礎上總結出教學設計過程的基本要素,如圖1-1所示。通過對教學設計模式的基本構成要素的分析,以及教學設計的實踐,我們得出教學設計的一般模式,如圖1-2所示。
  • 【教】教學設計的模式和教學策略的分類
    一、教學設計的模式教學設計的模式概述
  • 策略模式(上)
    今年開始深入學習設計模式,並把所思所想記錄下來,以備查閱。因為我以《Head First 設計模式》一書為導向,所以第一個學習的模式是策略模式。本篇為策略模式的上篇,我以傳統的嚴格意義上的面向對象語言 Java為例來說明此模式;我會在下一篇用非嚴格意義上的OO語言 Go基於同樣的例子進行說明。
  • 程式設計師必學設計模式,策略模式,讓你少改代碼提升效率
    經常有人會說,程式設計師寫代碼要什麼設計模式,隨便寫就行,這其實是一種很不好的習慣,就好比蓋房子,不需要設計圖隨便蓋就可以,但是想要蓋成高樓大廈,一定要經過嚴謹的設計,不然就容易崩塌。我們採用設計模式來寫代碼,更多的,是為了不坑自己。
  • ...設計模式:實戰策略模式「模擬多種營銷類型優惠券,折扣金額計算...
    策略模式是一種行為模式,也是替代大量ifelse的利器。六、策略模式重構代碼。接下來使用策略模式來進行代碼優化,也算是一次很小的重構。與上面面向流程式的開發這裡會使用設計模式,優惠代碼結構,增強整體的擴展性。1.
  • Java策略模式
    在策略模式中,可以在運行時更改類行為或其算法。 這種類型的設計模式屬於行為模式。在策略模式中,創建表示各種策略對象和其行為根據其策略對象而變化的上下文對象。 策略對象更改上下文對象的執行算法。實現實例在這個示例中,將創建一個 Strategy 接口,定義實現策略接口的操作和具體策略類。 上下文類- Context 是使用策略的類。StrategyPatternDemo是一個演示類,將使用上下文- Context 和策略對象來演示上下文行為基於其部署或使用的策略的變化。
  • 去掉臃腫的if else代碼塊(策略設計模式)
    開發中我們會經常寫if(...) { } else if(...) {} else if (...) {}等多個邏輯判斷,一般else if 會有好幾個,多個else if 代碼塊會使得整個方法看起來比較臃腫,這篇文章的目的就是通過策略設計模式減少甚至消滅else if1.
  • 掃盲:策略模式,成事兒還需要策略
    寫在前面前面也給大家說了,掃盲系列第一個專題是:設計模式,今天它來啦。設計模式是我們開發的內功,很多同學都知道設計模式很有用,但我們卻總是很難記住它,尤其是對於定義。其實,我們從來都不需要去記住它,但學習是必要的,我們需要把每一個招式化為自己的血肉,在編寫代碼的時候多一種設計手段。設計模式來源於生活,我們更應該用生活和它類比起來。
  • 策略模式
    思考一下:實現某一功能可以有多種算法或策略,我需要根據條件選擇相應的算法或策略來完成該功能。如:排序算法,可以使用冒泡排序、歸併排序、快速排序等。要怎麼實現呢?很多同學想,寫個類,每個方法是一種排序算法,然後再封裝一個方法寫 if...else...
  • 乾貨,策略模式你不知道的
    百度一搜,策略模式想必各類文章都有,今天講一講你在其他地方看不到的策略模式的思想。代碼誰都會寫,思想不是誰都有的。策略模式上節我們稍微的探討了下SpringSession中包含的設計模式。SpringSession 設計模式分析這節我們應用下SpringSession 所涉及的策略模式。
  • C語言,去你的策略模式!
    一旦要通過C語言來實現各種設計模式,必定會在嚴謹地維護類層次上造成非常繁瑣和臃腫的代碼。這是因為C++/java等自帶一套面向對象的工具,而C語言要在代碼設計中,不斷地根據實際情況來創造面向對象的工具。
  • 閱讀策略的教學模式解讀
    大量的閱讀策略教學研究均基於後兩種研究取向。下文介紹四種經研究發現對學生閱讀理解能力提升幫助較大的、著名的閱讀策略教學模式。互惠教學模式是帕林薩和布朗根據維果茨基的最近發展區理論發展起來的一種閱讀教學模式。
  • 如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息
    軟體項目實訓及課程設計指導——如何應用策略設計模式分離JDBC資料庫連接中的外部環境信息1、什麼是策略(Strategy)設計模式策略設計模式把「算法」(也就是軟體應用系統中的業務規則或者待實現的功能等)和「環境」(封裝軟體應用系統在實際應用時的場景)相互分離
  • Java設計模式之行為型模式
    行為型模式策略模式【strategy】(接口主要) 【學習難度:★☆☆☆☆,使用頻率:★★★★☆】定義:策略模式定義了一系列算法,並將每個算法封裝起來,使他們可以相互替換,且算法的變化不會影響到使用算法的客戶。
  • 教學設計的模式
    教學設計的模式在教師招聘考試中也是比較重要的一個重點內容,在考試中主要是以單選、多選的形式出題,所以考生在把握的過程中要重點掌握教學設計的模式分類,能夠區分出這三種模式。1.系統分析模式系統分析模式是在借鑑工程管理科學的某些原理基礎上形成的。這種模式將教學過程看做一個輸入 產出的系統過程「,輸入」是學生「,產出」是受過教育的人。
  • 從零開始學設計模式(一)——設計模式介紹及工廠模式
    他們所提出的設計模式主要是基於以下的面向對象設計原則。對接口編程而不是對實現編程。優先使用對象組合而不是繼承。設計模式的主要用途有兩個,一是提供了一個標準的術語系統,且具體到特定的場景。如單例設計模式意味著使用單個對象,這樣所有熟悉單例設計模式的開發人員都能使用單個對象,並且可以通過這種方式告訴對方,程序使用的是單例模式。
  • 課程設計的模式
    課程設計需要考慮學科、學生、社會及科技發展等因素,以下為常見的課程設計模式:一、目標模式根據課程設計者對學習者行為變化的期望而確定的教育目標進行課程設計的思路。典型代表人物:泰勒該模式產生於博比特提出的「活動分析」課程設計方法,由泰勒完善,他把課程設計過程概括為確定教育目標、選擇學習經驗、組織學習經驗、評價學習結果這樣四個步驟或階段。其中,塔巴將其充實成診斷需要、形成具體的目標、選擇內容、組織內容、選擇學習經驗(活動)、組織學習經驗(活動)、評價、檢查平衡性和順序性八個階段。