大話設計模式筆記(二) 策略模式

2022-05-02 03:12:11 字數 3467 閱讀 4178

商場收銀軟體,營業員根據客戶所購買的商品單價和數量,向客戶收費。

/**

* 普通實現

* created by callmedevil on 2019/6/1.

*/public class normaltest

/*** 計算總價

** @param price 單價

* @param num 數量

* @return

*/private static double calculatetotal(double price, double num)

}

商品搞**,打八折,也可能打七折,甚至五折。

/**

* 普通實現2

* created by callmedevil on 2019/6/1.

*/public class normaltest2 ;

system.out.println(string.format("單價:%s 元", price));

system.out.println(string.format("數量:%s 個", num));

system.out.println(string.format("折扣:%s ", discounts[1]));

system.out.println(string.format("總價:%s 元", calculatetotal(price, num, 1)));

}/**

* 計算總價

** @param price 單價

* @param num 數量

* @param discount 折扣

* @return

*/private static double calculatetotal(double price, double num, int discount)

return total;}}

有很多重複**,就switch語句來說,如果計算方式比較複雜,那麼這裡就會顯得非常冗餘,必須考慮重構,抽出共性**。而且如果需要打其他折扣,修改的地方也很多。

物件導向的程式設計,並不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的物件的抽象集合才是類。

/**

* 現金收費抽象類

* created by callmedevil on 2019/6/1.

*/public abstract class cashsuper

/**

* 正常收費子類

* created by callmedevil on 2019/6/1.

*/public class cashnormal extends cashsuper

}

/**

* 返利收費子類

* created by callmedevil on 2019/6/1.

*/public class cashreturn extends cashsuper

@override

public double acceptcash(double money)

return result;}}

/**

* 打折收費子類

* created by callmedevil on 2019/6/1.

*/public class cashrebate extends cashsuper

@override

public double acceptcash(double money)

}

/**

* 現金收費工廠類

* created by callmedevil on 2019/6/1.

*/public class cashfactory

return cs;}}

/**

* 現金收費測試

* created by callmedevil on 2019/6/1.

*/public class cashtest

}

輸出結果

單價:400.0 元,數量:3.0 個

折扣:正常收費;總價:1200.0 元

折扣:滿300減100;總價:900.0 元

折扣:打8折;總價:960.0 元

簡單工廠模式雖然也能夠解決問題2,但這個模式只是解決物件的建立問題,而且由於工廠本身包括了所有的收費模式,商場是可能經常性的更改打折額度和返利額度,每次維護或擴充套件收費方式都要改動這個工廠,以致**需要重新編譯部署,這是很糟糕的,所以不是最好的解決辦法。

定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不回影響到使用演算法的客戶。

其實上面的簡單工廠模式實現方式裡面的cashsuper、cashnormal、cashrebate、cashreturn都不需要更改,只需要增加乙個cashcontext類,同時修改下客戶端就可以了。

/**

* 現金上下文

* created by callmedevil on 2019/6/1.

*/public class cashcontext

}public double getresult(double money)

}

/**

* 策略模式測試

* created by callmedevil on 2019/6/1.

*/public class contexttest

}

策略模式測試類中的**與簡單工廠的非常相似,因為這裡將策略模式與簡單工廠模式做了結合,因此比較難以判斷策略模式的好處到底在哪。如果仔細分析一下會發現,只用簡單工廠的測試類中,也就是客戶端**耦合了cashsupercashfactory兩個類,而使用了策略模式的客戶端只涉及到了cashcontext乙個類,將客戶端與具體演算法的實現進行了解耦,這樣如果商場需要變更**折扣時,除了變更具體的折扣實現類,只需要更改cashcontext即可,客戶端完全不用做任何更改,這就是策略模式帶來的最大好處。

《大話設計模式》 筆記 策略模式

一 概念 策略模式 strategy 它定義了一系列的演算法,並將每乙個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法的變化不會影響到使用演算法的客戶。類圖如圖 優點 1 簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試。2 避免程式中使用多重條件轉移語句,使系統更...

大話設計模式 策略模式

前言 做事情的時候我們需要動動腦來簡化自己完成任務的負擔,這就需要講究策略了,我們會根據自己所處的環境列出所有的可能條件,再從中挑選合適的方法來完成這件事。就像我們過年回家,我們可以選擇高鐵 普通火車 還可以選擇硬座 軟座 臥鋪,這都是我們回家的策略 買不到直達的還得轉戰好幾個火車站,策略的最終到達...

大話設計模式 策略模式

前言 做事情的時候我們需要動動腦來簡化自己完成任務的負擔,這就需要講究策略了,我們會根據自己所處的環境列出所有的可能條件,再從中挑選合適的方法來完成這件事。就像我們過年回家,我們可以選擇高鐵 普通火車 還可以選擇硬座 軟座 臥鋪,這都是我們回家的策略 買不到直達的還得轉戰好幾個火車站,策略的最終到達...