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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第深入了解Java行為型設計模式之策略模式目錄策略模式應用場景優(yōu)缺點主要角色策略模式的基本使用創(chuàng)建抽象策略角色創(chuàng)建具體策略角色創(chuàng)建上下文角色客戶端執(zhí)行策略模式實現(xiàn)支付方式的選擇創(chuàng)建抽象策略角色創(chuàng)建具體策略角色創(chuàng)建上下文角色客戶端執(zhí)行

策略模式

策略模式(StrategyPattern)也叫政策模式(PolicyPattern),屬于行為型模式。

它是將定義的一系列算法、分別封裝起來,讓它們之間可以互相替換,從而讓算法的變化不會影響到使用算法的用戶。

策略模式能讓你定義一系列算法,并將每種算法分別放入獨立的類中,以使算法的對象能夠相互替換。

應用場景

1、針對同一類型問題,有多種處理方式,每一種都能獨立解決問題。

2、算法需要自由切換的場景。

3、需要屏蔽算法規(guī)則的場景。

優(yōu)缺點

優(yōu)點:

1.可以在運行時切換對象內(nèi)的算法。

2.避免使用多重條件轉移語句,如if.else.語句、switch語句

3.使用策略模式可以提高算法的保密性和安全性。

4.可以將算法的實現(xiàn)和使用算法的代碼隔離開來。

缺點:

1.客戶端必須知道所有的策略,所有策略類都需要對外暴露,并且自行決定使用哪一個策略類。

2.代碼中會產(chǎn)生非常多策略類,增加維護難度。

主要角色

1.抽象策略角色(Strategy)

規(guī)定策略或算法的行為。

2.具體策略角色(ConcreteStrategy)

具體的策略或算法實現(xiàn)。

3.上下文角色(Context)

用來操作策略的上下文環(huán)境,屏蔽高層模塊(客戶瑞)對策略,算法的直接訪問,封裝可能存在的變化。

策略模式的基本使用

創(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折

策略模式實現(xiàn)支付方式的選擇

創(chuàng)建抽象策略角色

創(chuàng)建支付抽象類,定義支付邏輯

publicabstractclassPayment{

*支付類型

publicabstractStringgetName();

*支付

*@paramuid用戶id

*@paramamount金額

*@return支付結果

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("購買:"+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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論