国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java通俗易懂系列設(shè)計(jì)模式之策略模式

瀏覽:22日期:2022-08-13 18:09:37
介紹

策略設(shè)計(jì)模式是行為設(shè)計(jì)模式之一。當(dāng)我們?yōu)樘囟ㄈ蝿?wù)使用多個(gè)算法時(shí),使用策略模式,客戶端決定在運(yùn)行時(shí)使用的實(shí)際實(shí)現(xiàn)。

Java通俗易懂系列設(shè)計(jì)模式之策略模式

策略模式的最佳示例之一是Collections.sort()采用Comparator參數(shù)的方法。基于Comparator接口的不同實(shí)現(xiàn),對(duì)象將以不同的方式進(jìn)行排序。

實(shí)例

對(duì)于我們的示例,我們將嘗試實(shí)施一個(gè)簡(jiǎn)單的購(gòu)物車(chē),我們有兩種付款策略 - 使用信用卡或使用PayPal。

首先,我們將為我們的策略模式示例創(chuàng)建接口,在我們的例子中,支付金額作為參數(shù)傳遞。支付方式:PaymentStrategy.java

package com.journaldev.design.strategy;public interface PaymentStrategy {public void pay(int amount);}

現(xiàn)在我們將不得不使用信用卡/借記卡或通過(guò)PayPal為支付創(chuàng)建具體的算法實(shí)現(xiàn)。

信用卡付款:CreditCardStrategy.java

package com.journaldev.design.strategy;public class CreditCardStrategy implements PaymentStrategy {private String name;private String cardNumber;private String cvv;private String dateOfExpiry;public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){this.name=nm;this.cardNumber=ccNum;this.cvv=cvv;this.dateOfExpiry=expiryDate;}@Overridepublic void pay(int amount) {System.out.println(amount +' paid with credit/debit card');}}

Paypal付款:PaypalStrategy.java

package com.journaldev.design.strategy;public class PaypalStrategy implements PaymentStrategy {private String emailId;private String password;public PaypalStrategy(String email, String pwd){this.emailId=email;this.password=pwd;}@Overridepublic void pay(int amount) {System.out.println(amount + ' paid using Paypal.');}}

現(xiàn)在我們的策略模式示例算法準(zhǔn)備好了。我們可以實(shí)施購(gòu)物車(chē)和付款方式將需要輸入作為付款策略。

package com.journaldev.design.strategy;public class Item {private String upcCode;private int price;public Item(String upc, int cost){this.upcCode=upc;this.price=cost;}public String getUpcCode() {return upcCode;}public int getPrice() {return price;}}

ShoppingCart.java

package com.journaldev.design.strategy;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.List;public class ShoppingCart {//List of itemsList<Item> items;public ShoppingCart(){this.items=new ArrayList<Item>();}public void addItem(Item item){this.items.add(item);}public void removeItem(Item item){this.items.remove(item);}public int calculateTotal(){int sum = 0;for(Item item : items){sum += item.getPrice();}return sum;}public void pay(PaymentStrategy paymentMethod){int amount = calculateTotal();paymentMethod.pay(amount);}}

請(qǐng)注意,購(gòu)物車(chē)的付款方式需要付款算法作為參數(shù),并且不會(huì)將其作為實(shí)例變量存儲(chǔ)在任何位置。

讓我們用一個(gè)簡(jiǎn)單的程序測(cè)試我們的策略模式示例設(shè)置。

ShoppingCartTest.java

package com.journaldev.design.strategy;public class ShoppingCartTest {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();Item item1 = new Item('1234',10);Item item2 = new Item('5678',40);cart.addItem(item1);cart.addItem(item2);//pay by paypalcart.pay(new PaypalStrategy('myemail@example.com', 'mypwd'));//pay by credit cardcart.pay(new CreditCardStrategy('Pankaj Kumar', '1234567890123456', '786', '12/15'));}}

上述程序的輸出是:

50 paid using Paypal.

50 paid with credit/debit card

類(lèi)圖

Java通俗易懂系列設(shè)計(jì)模式之策略模式

總結(jié)

我們可以使用組合為策略創(chuàng)建實(shí)例變量,但我們應(yīng)該避免這種情況,因?yàn)槲覀兿M麑⑻囟ú呗詰?yīng)用于特定任務(wù)。在Collections.sort()和Arrays.sort()方法中遵循相同的方法,將比較器作為參數(shù)。

策略模式與狀態(tài)模式(State Pattern)非常相似。其中一個(gè)區(qū)別是Context包含狀態(tài)作為實(shí)例變量,并且可以有多個(gè)任務(wù),其實(shí)現(xiàn)可以依賴于狀態(tài),而策略模式策略作為參數(shù)傳遞給方法,上下文對(duì)象沒(méi)有任何變量來(lái)存儲(chǔ)它。

當(dāng)我們?yōu)樘囟ㄈ蝿?wù)提供多個(gè)算法時(shí),策略模式很有用,我們希望我們的應(yīng)用程序可以靈活地在運(yùn)行時(shí)為特定任務(wù)選擇任何算法。

優(yōu)點(diǎn):1、算法可以自由切換。2、避免使用多重條件判斷。3、擴(kuò)展性良好。 缺點(diǎn):1、策略類(lèi)會(huì)增多。 2、所有策略類(lèi)都需要對(duì)外暴露。 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來(lái)的復(fù)雜和難以維護(hù)。 何時(shí)使用:一個(gè)系統(tǒng)有許多許多類(lèi),而區(qū)分它們的只是他們直接的行為。 如何解決:將這些算法封裝成一個(gè)一個(gè)的類(lèi),任意地替換。 關(guān)鍵代碼:實(shí)現(xiàn)同一個(gè)接口。 使用場(chǎng)景: 1、如果在一個(gè)系統(tǒng)里面有許多類(lèi),它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。 2、一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。 3、如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J剑@些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。 注意事項(xiàng):如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式,解決策略類(lèi)膨脹的問(wèn)題。

以上就是Java通俗易懂系列設(shè)計(jì)模式之策略模式的詳細(xì)內(nèi)容,更多關(guān)于Java設(shè)計(jì)模式的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日本亚洲欧美高清专区vr专区 | 久久这里只有精品免费播放 | 国产精品一一在线观看 | 欧美成人免费在线观看 | 免费在线观看一区二区 | 日韩精品永久免费播放平台 | a免费网站| 成人国产精品免费网站 | 91久久国产综合精品女同国语 | 九九精品免费观看在线 | 久久精品国产精品亚洲20 | 成人在线视频免费观看 | 欧美三级香港三级日本三级 | 久草观看| 国产日韩高清一区二区三区 | 亚洲精品免费在线观看 | 最新国产三级在线不卡视频 | 日韩一区二区在线免费观看 | 欧美区一区二 | 99精品视频在线在线视频观看 | 亚洲综合久久1区2区3区 | 天干夜天天夜天干天ww | 国产精品一久久香蕉国产线看 | 久久久久久久综合色一本 | 久久国产免费 | 国产精品私人玩物在线观看 | 中国黄色网址大全 | 粉嫩jk制服美女啪啪 | 国产美女精品视频免费观看 | 亚洲精品久久久久网站 | 久久国内精品自在自线400部o | 欧美一级片免费观看 | 久久久久久毛片免费播放 | 伊人色综合久久天天网蜜月 | 97国内免费久久久久久久久久 | 国产成人狂喷潮在线观看2345 | 亚洲女人被黑人猛躁进女人 | 亚洲日本va午夜中文字幕一区 | 久久日本精品一区二区免费 | 亚洲欧美国产18 | 日韩色在线 |