策略模式应用场景和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_策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: i2c linux 驱动(i2c lin
- 下一篇: jetty代理jetty_如何在Jett