




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第深入了解Java行為型設(shè)計模式之策略模式目錄策略模式應(yīng)用場景優(yōu)缺點主要角色策略模式的基本使用創(chuàng)建抽象策略角色創(chuàng)建具體策略角色創(chuàng)建上下文角色客戶端執(zhí)行策略模式實現(xiàn)支付方式的選擇創(chuàng)建抽象策略角色創(chuàng)建具體策略角色創(chuàng)建上下文角色客戶端執(zhí)行
策略模式
策略模式(StrategyPattern)也叫政策模式(PolicyPattern),屬于行為型模式。
它是將定義的一系列算法、分別封裝起來,讓它們之間可以互相替換,從而讓算法的變化不會影響到使用算法的用戶。
策略模式能讓你定義一系列算法,并將每種算法分別放入獨立的類中,以使算法的對象能夠相互替換。
應(yīng)用場景
1、針對同一類型問題,有多種處理方式,每一種都能獨立解決問題。
2、算法需要自由切換的場景。
3、需要屏蔽算法規(guī)則的場景。
優(yōu)缺點
優(yōu)點:
1.可以在運行時切換對象內(nèi)的算法。
2.避免使用多重條件轉(zhuǎn)移語句,如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支付結(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("購買:"+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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)流量監(jiān)測工具試題及答案
- 機電工程動手能力試題及答案
- 公共政策的社會影響與評估方法試題及答案
- 公共政策實施策略試題及答案
- 機電工程互動學(xué)習(xí)活動試題及答案
- 網(wǎng)絡(luò)工程師考試準備技巧分享與2025年試題與答案
- 社會保障政策的國際比較試題與答案
- 機電工程模擬試卷分享及試題及答案
- 文化多樣性與政策制定的挑戰(zhàn)試題及答案
- 機電工程外部環(huán)境分析試題及答案2025
- 2025年行政執(zhí)法證考試必考題庫及答案(共三套)
- 《夏季養(yǎng)生保健常識》課件
- 2025年傳統(tǒng)建筑行業(yè)的智能門窗技術(shù)
- 2024年湖北高中學(xué)業(yè)水平合格性考試歷史試卷真題(含答案詳解)
- 合伙經(jīng)營自媒體合同范例
- 2025版亞馬遜FBA物流倉儲及電商運營服務(wù)合同6篇
- DB34-T 3035-2017 省級濕地公園建設(shè)規(guī)范
- 口腔門診股份合作協(xié)議書(2篇)
- 《腦淀粉樣變性》課件
- 北師大教育研究方法課件
- T-GXAS 421-2022 成人急性中毒洗胃操作技術(shù)規(guī)范
評論
0/150
提交評論