




版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年山西靈丘縣為縣經(jīng)濟建設投資有限責任公司招聘筆試參考題庫含答案解析
- 小學一年級安全教育主題班會
- 風力發(fā)電機畢業(yè)設計答辯
- 2025年江蘇常州市科維建設投資有限公司招聘筆試參考題庫附帶答案詳解
- 2025年湖北省文化旅游投資集團有限公司招聘筆試參考題庫附帶答案詳解
- 2025年廣東深圳市深水水務咨詢有限公司招聘筆試參考題庫附帶答案詳解
- XX高層項目附著式升降腳手架(爬架)施工方案
- 健康飲食:塑造未來的健康-營養(yǎng)知識與良好習慣
- 家庭教育中的廉政建設
- 污水厭氧處理技術培訓課件
- 2024年江蘇常州中考滿分作文《那么舊那樣新》8
- 全國各氣象臺站區(qū)站號及經(jīng)緯度
- 經(jīng)典話劇劇本《雷雨》
- 鞏漢林小品《最后一堂課》臺詞劇本手稿
- 《數(shù)控車床編程與操作》PPT課件
- 電力拖動習習題冊
- 應急預案演練記錄表范例
- 安裝施工安全保障措施
- 機房加固設計方案(承重)(共7頁)
- 管理系統(tǒng)中計算機應用PPT課件
- 璧山區(qū)5G+智慧農(nóng)業(yè)項目商業(yè)計劃書-模板范文
評論
0/150
提交評論