商場收銀軟體,營業員根據客戶所購買的商品單價和數量,向客戶收費。
/**
* 普通實現
* 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
}
策略模式測試類中的**與簡單工廠的非常相似,因為這裡將策略模式與簡單工廠模式做了結合,因此比較難以判斷策略模式的好處到底在哪。如果仔細分析一下會發現,只用簡單工廠的測試類中,也就是客戶端**耦合了cashsuper和cashfactory兩個類,而使用了策略模式的客戶端只涉及到了cashcontext乙個類,將客戶端與具體演算法的實現進行了解耦,這樣如果商場需要變更**折扣時,除了變更具體的折扣實現類,只需要更改cashcontext即可,客戶端完全不用做任何更改,這就是策略模式帶來的最大好處。 《大話設計模式》 筆記 策略模式
一 概念 策略模式 strategy 它定義了一系列的演算法,並將每乙個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法的變化不會影響到使用演算法的客戶。類圖如圖 優點 1 簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試。2 避免程式中使用多重條件轉移語句,使系統更...
大話設計模式 策略模式
前言 做事情的時候我們需要動動腦來簡化自己完成任務的負擔,這就需要講究策略了,我們會根據自己所處的環境列出所有的可能條件,再從中挑選合適的方法來完成這件事。就像我們過年回家,我們可以選擇高鐵 普通火車 還可以選擇硬座 軟座 臥鋪,這都是我們回家的策略 買不到直達的還得轉戰好幾個火車站,策略的最終到達...
大話設計模式 策略模式
前言 做事情的時候我們需要動動腦來簡化自己完成任務的負擔,這就需要講究策略了,我們會根據自己所處的環境列出所有的可能條件,再從中挑選合適的方法來完成這件事。就像我們過年回家,我們可以選擇高鐵 普通火車 還可以選擇硬座 軟座 臥鋪,這都是我們回家的策略 買不到直達的還得轉戰好幾個火車站,策略的最終到達...