1. 程式人生 > >一天一個設計模式:策略模式

一天一個設計模式:策略模式

概念:

  策略模式屬於物件的行為模式,其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響客戶端的情況下變化。

結構:

環境(Context)角色:持有一個Strategy的引用。

抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或抽象類實現,此角色給出所有的具體策略類所需的介面。

具體策略(ConcreteStrategy)角色:包含具體場景的演算法。

程式碼示例:

環境角色:

public class Context {
    //持有一個具體策略的物件
    private Strategy strategy;
    
/** * 建構函式,傳入一個具體策略物件 * @param strategy 具體策略物件 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
View Code

抽象策略類:

public interface
Strategy { /** * 策略方法 */ public void strategyInterface(); }
View Code

具體策略類:

public class ConcreteStrategyA implements Strategy {

    @Override
    public void strategyInterface() {
        //相關的業務
    }

}

//後面兩個重複這個類
View Code

使用常見:

我們以手抓餅訂單為例,即有普通手抓餅,高階手抓餅,頂級手抓餅。

場景就是接單類,根據具體的演算法來生產不同的手抓餅訂單。

接單類:

public class ReceiveOrder {
    private ShouzhuabingOrder shouzhuabingOrder;

    public ReceiveOrder(ShouzhuabingOrder shouzhuabingOrder) {
        this.shouzhuabingOrder = shouzhuabingOrder;
    }

    //其實這我們可以對該函式進行一些功能強化,讓其在演算法選擇的基礎上進行一些功能的擴充套件
    //具體的可以參考java中Collections類下面的sort方法。
    //例如我們可以通過引數作為輸入,相當於使用者除了做定製化的手抓餅外,還可以再次基礎上進行個性化的定製。
    public String makeOrder() {
        return shouzhuabingOrder.makeOrder();
    }
}
View Code

手抓餅訂單介面:

public interface ShouzhuabingOrder {

    public String makeOrder();
}
View Code

普通手抓餅:

public class OriginOrder implements ShouzhuabingOrder {
    @Override
    public String makeOrder() {
        return "我是基礎的手抓餅,只有一張餅,一個蛋還有各種醬";
    }
}
View Code

高檔手抓餅:

public class MediumOrder implements ShouzhuabingOrder {

    @Override
    public String makeOrder() {
        return "我是一箇中級手抓餅,自帶一張餅,兩個蛋,還有自制醬料";
    }
}
View Code

豪華手抓餅:

public class HighOrder implements ShouzhuabingOrder {
    @Override
    public String makeOrder() {
        return "我是高階手抓餅,我有一張餅,兩個蛋,一個裡脊,一個薄脆還有自制醬料。";
    }
}
View Code

實際的接受訂單的過程:

public class Test {
    public static void main(String[] args) {
        HighOrder highOrder = new HighOrder();

        ReceiveOrder receiveOrder = new ReceiveOrder(highOrder);

        System.out.println(receiveOrder.makeOrder());
    }
}
View Code

策略模式的核心:

  不管演算法的實現,而是對演算法做一個選擇,組織,呼叫,從而使程式在結構上更加清晰,也更加方便維護和擴充套件。

策略模式的平等性:

  演算法的地位相同,可以相互替換,相互無依賴,策略模式中的演算法關係未:相同行為的不同實現。

策略模式執行時的唯一性:

  執行時,每一個時刻只能使用一個具體的策略實現物件,雖然可以動態切換,但是在同一時刻,只能是一個。

共有行為:

  若所有演算法均有具體的行為,可以將演算法介面改成抽象類,同時共有的行為進行定義。

策略模式的優點:

  1.策略模式提供了管理相關演算法的演算法族的方法,可以將部分共有程式碼移到父類,從而避免重複。

  2.使用策略模式,可以避免重複條件的判定(if-else)。

策略模式的缺點:

  1.客戶端必須知道所有的策略,並自行決定使用哪種策略,以便選用合適的演算法。(我還沒有想明白這點,這自行判斷還不是要依賴if else)

  2.備選的策略多的話,類的數量會很多,不方便管理。

相關推薦

天一設計模式策略模式

概念:   策略模式屬於物件的行為模式,其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響客戶端的情況下變化。 結構: 環境(Context)角色:持有一個Strategy的引用。 抽象策略(Strategy)角色:這是一個抽象角色

天一設計模式介面卡模式

概念:   介面卡模式是把一個類的介面變成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。 用途:   就像插頭轉換器,之前入了switch港版,插頭是英式的,還好附贈一個插頭轉換器,介面卡就相當於這個轉換器。 種類:   分為類的介面卡與物件的介面卡兩種

天一設計模式工廠方法模式

工廠方法模式:   定義一個生產產品物件的工廠介面,將建立生產產品的工廠的工作交給子類實現。   隨著實際需要的工廠數量增加,簡單工廠模式體積會迅速膨脹,程式碼迅速臃腫嚴重。  補充:工廠方法模式是針對一類產品的工廠   所以為了程式碼的可閱讀下與可維護性,也做到不同的業務有一定的隔離,將工廠的功能抽象出來成

天一設計模式裝飾者模式

概念:   裝飾者模式又稱為包裝(wrapper)模式。裝飾者模式對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案。 結構:   裝飾者模式以透明的方式給一個物件附加上更多的責任,換而言之,客戶端並不會覺得物件在裝飾前後有什麼不同,裝飾者模式可以在不使用創造更多子類的情況下,將物件的功能拓展。

天一設計模式抽象方法模式

為什麼引入抽象工廠模式? 或者說抽象工廠模式與工廠方法模式的區別? 工廠方法模式針對的是一類產品的等級結構,而抽象工廠模式針對的是多個產品等級結構(一個產品族)。 引入概念:產品族與產品等級 產品族:指在不同的產品等級結構中,功能相關聯的產品組成的家族。產品等級:同類產品的不同產品區分。 抽象工廠的作用:

天一設計模式建造模式

概念:   建造模式是物件的建立模式,建造模式可以將一個產品的內部表象(個人理解,可以稱為元件)與產品的生產分割開來,從而可以使一個建造過程生產出來具有不同內部表象的產品物件。 概念: 產品的內部表象:   產品不同組成成分構成(元件)這些零件可以是物件,也可以是非物件,稱為內部表象(internal re

天一設計模式單例模式

概念:   作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化,並向整個系統提供這個例項。 特點:   1.單例類只能有一個例項   2.單例類必須建立自己的唯一例項   3.單例類必須給其他所有物件提供這一例項。 餓漢式單例類 public class EagerSingleton {

天一設計模式模板方法模式

概念:   模板方法模式是類的行為模式,準備一個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的意思。 結構:   模板方法模式中,抽象類負責定義整個的邏輯框架,

天一設計模式(五) - 適配器模式(Adapter)

p s func 靈活性 nsh ans target 多線程 isp pattern 前言 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 適配器模式的用途 最經典的就是電器的例子,筆記本電腦的插

天一設計模式(四) - 原型模式(Prototype)

管理員 ans rip prototype register 性能 除了 func comm 前言 原型模式屬於對象的創建模式。通過給出一個原型對象來指明所有創建的對象的類型,然後用這個原型對象提供的復制辦法創建出更多同類型的對象。 原型模式的結構 原型模式要求對象實現

天一設計模式() - 總體概述

享元 關註 責任鏈 分布式 分享圖片 模板方法 mage upload 抽象工廠 前言 最近在對設計模式進行了一系列總結,本文將給大家關於設計模式的一個整體的介紹。 正文 1. 定義 設計模式是某類特定問題的代碼設計解決方案,是一套代碼設計的經驗總結。 2. 作用 提高

天一設計模式---裝飾者模式

優點:它可以動態為物件新增功能。 場景:我們希望為某個物件而不是整個類新增一些功能。 一、角色及作用 裝飾者和被裝飾者擁有相同的元件介面。被裝飾者是系統的核心元件,完成特定功能。裝飾者則可以在被裝飾者的方法前後,加上特定的前置處理和後置處理,增強被裝飾

PHP設計模式策略模式

php interface 設計模式 策略模式 步驟1.定義策略接口#UserStrategy.php 用戶策略 <?php namespace celvmoshi; /**用戶策略接口 * Interface UserStategy * @package celvmoshi

設計模式策略模式

urn gyb 能夠 數據庫 ret 它的 RF 可擴展 優惠 1. 模式的定義 假設現在要實現一個簡化的報價管理,實現如下的功能: 1. 對於普通客戶或者新客戶報全價 2. 對於老客戶報的價格,統一折扣5% 3. 對於大客戶報的價格,統一折扣10% 對不同的人員報不同的價

Spring中常用的設計模式策略模式

在閻巨集博士的《JAVA與模式》一書中開頭是這樣描述策略(Strategy)模式的:     策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。

Java設計模式策略模式

原文連結 譯者:秦建平 下面是一個有關於策略模式的故事。假設Mike在開車的時候,會很頻繁的加速,有一天因為超速他被一個警察攔下來了。有可能這個警察會比較友好,沒開任何罰單就讓Mike把車開走了。(我們把這型別的警察稱之為“NicePolice”)。也有可能Mike遇到了一個不太友好的警察,然

5. php設計模式策略模式的實際應用

原文地址 最近寫了一個整合各家支付的開源專案(支付寶與微信)。專案地址。讓呼叫支付變得更加簡單、統一。目前已經在公司商城推行使用,上海一米市集也採用了這個支付整合專案。 我可不是打廣告哦,只是為了讓大家可以有一個只管的瞭解渠道。可以去看看。 今天主

設計模式策略模式(Strategy Pattern)

/** * 策略模式。 * @author Bright Lee */ public class StrategyPattern { public static void main(String[] args) { int num1 = 1; int num2 = 2;

【經典案例】Python詳解設計模式策略模式

src 手動 pri 依賴 同學 ice als pass concrete 完成一項任務往往有多種方式,我們將其稱之為策略。 比如,超市做活動,如果你的購物積分滿1000,就可以按兌換現金抵用券10元,如果購買同一商品滿10件,就可以打9折,如果如果購買的金額超過500,

設計模式策略模式,Java集合定製排序的核心思想

前言 前陣子面試的時候,有個面試官問我瞭解哪些設計模式嗎?我說了策略模式。接著他問有哪些場景應用,我又回答他jdk的集合工具類有個排序方法就用到了策略模式,也就是java.util包下的Collections類,該類中有個sort方法,我們可以自定義排序規則實現集合的定製排序,這就是策略模式最直接的應用,說完