深入了解Java行為型設(shè)計(jì)模式之策略模式_第1頁
深入了解Java行為型設(shè)計(jì)模式之策略模式_第2頁
深入了解Java行為型設(shè)計(jì)模式之策略模式_第3頁
深入了解Java行為型設(shè)計(jì)模式之策略模式_第4頁
深入了解Java行為型設(shè)計(jì)模式之策略模式_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論