策略模式:strategy,是指,定義一組演算法,並把其封裝到乙個物件中。然後在執行時,可以靈活的使用其中的乙個演算法。以下記錄我對策略模式的理解(部分解釋借鑑自廖雪峰老師)
策略模式是為了允許呼叫方選擇乙個演算法,從而通過不同策略實現不同的計算結果。體現了模組化的思想,不必為了一點小改動而造成程式整體的修改,方便使用者選擇不同方案。通過擴充套件策略,不必修改主邏輯,即可獲得新策略的結果。
乙個完整的策略模式要定義策略以及使用策略的上下文。我們以網購圖書為例,假設**針對普通顧客、會員有不同的折扣,同時活動期間還有乙個滿100減20的活動,這些就可以作為策略實現。
先定義打折策略介面:
public
inte***ce
discountstrategy
策略示意圖如下,共有三種打折策略
┌───────────────┐ ┌─────────────────┐
│discountcontext│─ ─ ─>│discountstrategy │
└───────────────┘ └─────────────────┘
▲│ ┌─────────────────────┐
├─│commonuserstrategy │
│ └─────────────────────┘
│ ┌─────────────────────┐
├─vipstrategy│
│ └─────────────────────┘
│ ┌─────────────────────┐
└─│specialstrategy │
└─────────────────────┘
要應用策略,需要建立上下文部分
public
class
discountcontext
public bigdecimal calculateprice
(bigdecimal total)
}
接下來,就是三種可供選擇的策略。
1.普通顧客和會員的策略:
public
class
userdiscountstrategy
implements
discountstrategy
}
活動期間**策略如下
public
class
overdiscountstrategy
implements
discountstrategy
}
呼叫方必須首先建立乙個discountcontext,並指定乙個策略(或者使用預設策略),即可獲得折扣後的**:
discountcontext discount =
newdiscountcontext()
;// 預設策略(普通使用者)折扣:
bigdecimal count1 = discount.
calculateprice
(bigdecimal.
valueof
(120))
;system.out.
println
(count1)
;// 活動折扣:
discount.
setstrategy
(new
overdiscountstrategy()
);bigdecimal count2 = discount.
calculateprice
(bigdecimal.
valueof
(120))
;system.out.
println
(count2)
;// 會員折扣:
discount.
setstrategy
(new
primediscountstrategy()
);bigdecimal count3 =discount.
calculateprice
(bigdecimal.
valueof
(120))
;system.out.
println
(count3)
;
設計模式 策略設計模式
策略設計模式其實就是多型的使用,父類引用指向子類物件。策略模式的最大特點是使得演算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成乙個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。案列 author de...
設計模式 策略模式
策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些方法完成的都是相同的工作,只是實現不同,他們可以用相同的方式呼叫所有的演算法,減少了演算法類和使用演算法類之間的耦合.優點 策略模式的strategy類層次為context定義了一系列可供重用的演算法和行為,繼承有助於吸取這些演算法中的公共...
設計模式 策略模式
定義了演算法家族,分別封裝起來,讓他們之間可以相互替代,此模式讓演算法的變化,不會影響到使用演算法的客戶端 定義抽象類 分別實現抽象類,不同的物件 然後用乙個類初始化,並傳入具體的策略物件 根據具體的策略物件,呼叫其演算法的方法 客戶端 是由於例項化不同的策略,所以最終在呼叫 類時,所獲得的結果時不...