日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

策略模式应用场景和uml_策略模式

發布時間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 策略模式应用场景和uml_策略模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

策略模式應用場景和uml

在最近的博客中,我收到了Wojciech Soczy?ski的評論,內容涉及在使用“不要問”(TDA)時如何使用“戰略”模式實施單一責任原則(SRP)。 在某些時候,我打算進一步討論這個問題,但首先想到的,這將是一個好主意,用我的購物例子,我用了幾個星期前在我的定義策略模式泰爾不問及其后續行動拆卸泰爾不要問博客:

首先定義:用最簡單的術語,您可以將策略模式定義為告訴對象執行一項工作,并使用ANOTHER對象來執行它。

為了進一步闡明這一點,我將通過給它一個pay()*方法來稍微重新設計ShoppingCart:

public class ShoppingCart {private final List<Item> items;public ShoppingCart() {items = new ArrayList<Item>();}public void addItem(Item item) {items.add(item);}public double calcTotalCost() {double total = 0.0;for (Item item : items) {total += item.getPrice();}return total;}public boolean pay(PaymentMethod method) {double totalCost = calcTotalCost();return method.pay(totalCost);} }

關于pay()方法要注意的是,它采用了類型PaymentMethod的一個參數–在我上面的定義中,PaymentMethod是“ ANOTHER”對象。

接下來要做的是將PaymentMethod定義為接口。 為什么要使用界面? 這是因為該技術的強大之處在于您可以在運行時決定將哪種具體類型傳遞給ShoppingCart進行付款。 例如,給定“付款”界面:

public interface PaymentMethod {public boolean pay(double amount);}

然后,您可以定義任何具體的付款對象,例如Visa或MasterCard,例如:

public class Visa implements PaymentMethod {private final String name;private final String cardNumber;private final Date expires;public Visa(String name, String cardNumber, Date expires) {super();this.name = name;this.cardNumber = cardNumber;this.expires = expires;}@Overridepublic boolean pay(double amount) {// Open Comms to Visa// Verify connection// Paybill using these detailsreturn true; // if payment goes through}}

…和

public class MasterCard implements PaymentMethod {private final String name;private final String cardNumber;private final Date expires;public MasterCard(String name, String cardNumber, Date expires) {super();this.name = name;this.cardNumber = cardNumber;this.expires = expires;}@Overridepublic boolean pay(double amount) {// Open Comms to Mastercard// Verify connection// Paybill using these detailsreturn true; // if payment goes through}}

最后要做的就是通過單元測試來證明這一點:payBillUsingVisa

@Testpublic void payBillUsingVisa() {ShoppingCart instance = new ShoppingCart();Item a = new Item("gloves", 23.43);instance.addItem(a);Item b = new Item("hat", 10.99);instance.addItem(b);Date expiryDate = getCardExpireyDate();PaymentMethod visa = new Visa("CaptainDebug", "1234234534564567", expiryDate);boolean result = instance.pay(visa);assertTrue(result);}private Date getCardExpireyDate() {Calendar cal = Calendar.getInstance();cal.clear();cal.set(2015, Calendar.JANUARY, 21);return cal.getTime();}

在上面的代碼中,您可以看到我正在創建一個ShoppingCart,然后添加了一些商品。 最后,我以Visa對象的形式創建了一個新的PaymentMethod,并將其注入到pay(PaymentMethod method)函數中,這是問題的癥結所在。 在另一種情況下,我可以輕松創建一個MasterCard對象并將其用作Visa的直接替代品-即作為參數傳遞的對象是在運行時確定的。

這就定義了戰略模式,但這還不是博客的結尾。 如果您曾經使用過Spring,但從未聽說過Strategy模式,那么您應該對這一切感到有些熟悉。 這是因為事實證明,Spring的家伙使用策略模式來支撐他們的整個技術。 如果以上面的示例為例,并進行一些細微更改,我可以得出:

@Component public class SpringShoppingCart {private final List<Item> items;@Autowired@Qualifier("Visa")private PaymentMethod method;public SpringShoppingCart() {items = new ArrayList<Item>();}public void addItem(Item item) {items.add(item);}public double calcTotalCost() {double total = 0.0;for (Item item : items) {total += item.getPrice();}return total;}public boolean pay() {double totalCost = calcTotalCost();return method.pay(totalCost);} }

這種化身與第一個化身之間的唯一區別是,使用@Autowired注釋加載策略類Visa時,Spring會注入該策略類。 綜上所述,我猜想這意味著策略模式是世界上最受歡迎的模式。

*出于討論的目的,我假設ShoppingCart可以自己付費,但是這是否正確,是一個全新的博客……

參考: Captain Debug博客博客中來自JCG合作伙伴 Roger Hughes的《策略模式》 。


翻譯自: https://www.javacodegeeks.com/2012/04/strategy-pattern.html

策略模式應用場景和uml

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的策略模式应用场景和uml_策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。