




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第深入了解Java行為型設(shè)計(jì)模式之策略模式目錄策略模式應(yīng)用場(chǎng)景優(yōu)缺點(diǎn)主要角色策略模式的基本使用創(chuàng)建抽象策略角色創(chuàng)建具體策略角色創(chuàng)建上下文角色客戶端執(zhí)行策略模式實(shí)現(xiàn)支付方式的選擇創(chuàng)建抽象策略角色創(chuàng)建具體策略角色創(chuàng)建上下文角色客戶端執(zhí)行
策略模式
策略模式(StrategyPattern)也叫政策模式(PolicyPattern),屬于行為型模式。
它是將定義的一系列算法、分別封裝起來,讓它們之間可以互相替換,從而讓算法的變化不會(huì)影響到使用算法的用戶。
策略模式能讓你定義一系列算法,并將每種算法分別放入獨(dú)立的類中,以使算法的對(duì)象能夠相互替換。
應(yīng)用場(chǎng)景
1、針對(duì)同一類型問題,有多種處理方式,每一種都能獨(dú)立解決問題。
2、算法需要自由切換的場(chǎng)景。
3、需要屏蔽算法規(guī)則的場(chǎng)景。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.可以在運(yùn)行時(shí)切換對(duì)象內(nèi)的算法。
2.避免使用多重條件轉(zhuǎn)移語句,如if.else.語句、switch語句
3.使用策略模式可以提高算法的保密性和安全性。
4.可以將算法的實(shí)現(xiàn)和使用算法的代碼隔離開來。
缺點(diǎn):
1.客戶端必須知道所有的策略,所有策略類都需要對(duì)外暴露,并且自行決定使用哪一個(gè)策略類。
2.代碼中會(huì)產(chǎn)生非常多策略類,增加維護(hù)難度。
主要角色
1.抽象策略角色(Strategy)
規(guī)定策略或算法的行為。
2.具體策略角色(ConcreteStrategy)
具體的策略或算法實(shí)現(xiàn)。
3.上下文角色(Context)
用來操作策略的上下文環(huán)境,屏蔽高層模塊(客戶瑞)對(duì)策略,算法的直接訪問,封裝可能存在的變化。
策略模式的基本使用
創(chuàng)建抽象策略角色
publicinterfaceIStrategy{
*算法、策略
voidalgorithm();
創(chuàng)建具體策略角色
publicclassConcreteStrategyAimplementsIStrategy{
publicvoidalgorithm(){
System.out.println("StrategyA打9折");
publicclassConcreteStrategyBimplementsIStrategy{
publicvoidalgorithm(){
System.out.println("StrategyB打8折");
創(chuàng)建上下文角色
publicclassContext{
privateIStrategymStrategy;
publicContext(IStrategystrategy){
this.mStrategy=strategy;
publicvoidalgorithm(){
this.mStrategy.algorithm();
}
客戶端執(zhí)行
publicstaticvoidmain(String[]args){
//創(chuàng)建具體策略
IStrategystrategyA=newConcreteStrategyA();
IStrategystrategyB=newConcreteStrategyB();
//創(chuàng)建上下文環(huán)境
ContextcontextA=newContext(strategyA);
ContextcontextB=newContext(strategyB);
//客戶端直接讓上下文環(huán)境執(zhí)行算法
contextA.algorithm();
contextB.algorithm();
StrategyA打9折
StrategyB打8折
策略模式實(shí)現(xiàn)支付方式的選擇
創(chuàng)建抽象策略角色
創(chuàng)建支付抽象類,定義支付邏輯
publicabstractclassPayment{
*支付類型
publicabstractStringgetName();
*支付
*@paramuid用戶id
*@paramamount金額
*@return支付結(jié)果
publicStringpay(Stringuid,doubleamount){
if(queryBalance(uid)amount){
return"支付失敗,"+"商品金額:"+amount+",用戶余額:"+queryBalance(uid);
return"支付成功,"+"商品金額:"+amount+",用戶余額:"+(queryBalance(uid)-amount);
*余額查詢
*@paramuid用戶id
*@return余額
protectedabstractdoublequeryBalance(Stringuid);
}
創(chuàng)建具體策略角色
創(chuàng)建具體支付方式,如AliPay、WechatPay、UnionPay等三種方式。
publicclassAliPayextendsPayment{
publicStringgetName(){
return"支付寶";
protecteddoublequeryBalance(Stringuid){
return500;
publicclassWechatPayextendsPayment{
publicStringgetName(){
return"微信支付";
protecteddoublequeryBalance(Stringuid){
return600;
publicclassUnionPayextendsPayment{
publicStringgetName(){
return"銀聯(lián)支付";
protecteddoublequeryBalance(Stringuid){
return800;
}
創(chuàng)建上下文角色
創(chuàng)建上下文角色,
publicclassPayStrategy{
publicstaticfinalStringALI_PAY="AliPay";
publicstaticfinalStringWECHAT_PAY="WechatPay";
publicstaticfinalStringUNION_PAY="UnionPay";
publicstaticfinalStringDEFAULT_PAY=ALI_PAY;
privatestaticMapString,Paymentstrategy=newHashMapString,Payment
static{
strategy.put(ALI_PAY,newAliPay());
strategy.put(WECHAT_PAY,newWechatPay());
strategy.put(UNION_PAY,newUnionPay());
publicstaticPaymentget(StringpayKey){
if(!strategy.containsKey(payKey)){
returnstrategy.get(DEFAULT_PAY);
returnstrategy.get(payKey);
}
客戶端執(zhí)行
publicclassOrder{
privateStringuid;
privateStringname;
privatedoubleprice;
publicOrder(Stringuid,Stringname,doubleprice){
this.uid=uid;
=name;
this.price=price;
publicStringpay(){
returnpay(PayStrategy.DEFAULT_PAY);
publicStringpay(StringpayKey){
Paymentpayment=PayStrategy.get(payKey);
System.out.println("購(gòu)買:"+name+",使用"+payment.getName()+"支付,"+"支付金額為:"+price);
returnpayment.pay(uid,price);
}
publicstaticvoidmain(String[]args){
Orderorder=newOrder("001","皮皮蝦",500.5);
System.out.println(order.pay());
System.out.println("----------------------------------------------------");
System.out.println(order.pay(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新手必看的無人機(jī)考試試題及答案
- 初級(jí)護(hù)師考試重癥監(jiān)護(hù)要點(diǎn)與試題及答案
- 外語學(xué)習(xí)效果評(píng)估的指標(biāo)試題及答案
- 初級(jí)審計(jì)知識(shí)框架的搭建與理解試題及答案
- 應(yīng)對(duì)護(hù)理工作中的壓力技巧試題及答案
- 向前看2025年入團(tuán)考試試題及答案
- 2024年審計(jì)職業(yè)責(zé)任試題及答案分析
- 掌握應(yīng)試技能2025年一級(jí)建造師考試試題及答案
- 22025年初級(jí)護(hù)師考試成功關(guān)鍵試題及答案
- 中級(jí)審計(jì)師應(yīng)試技巧試題及答案
- 2024-2025學(xué)年八年級(jí)下學(xué)期道德與法治期中模擬試卷(二)(統(tǒng)編版含答案解析)
- 測(cè)試團(tuán)隊(duì)協(xié)作模式-全面剖析
- 武安市公安局招聘警務(wù)輔助人員筆試真題2024
- 2023年高考真題-物理(廣東卷) 含答案
- 土木工程專業(yè)外文文獻(xiàn)及翻譯
- 2024年江蘇常州中考滿分作文《那么舊那樣新》8
- 第三單元整本書閱讀《朝花夕拾》“魯迅心中的那些情”主題交流課 教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版語文七年級(jí)上冊(cè)
- 2025年駕照C1證考試科目一必考題庫(kù)740題及答案(包過版)
- 氣候變化適應(yīng)成本-深度研究
- 第2課《風(fēng)鈴》課件 花城版音樂三年級(jí)下冊(cè)
- R245fa螺旋管內(nèi)分液冷凝特性實(shí)驗(yàn)研究
評(píng)論
0/150
提交評(píng)論