
1 package strategy; 2 /* 3 * 具體策略角色:高級會員 4 */ 5 public class AdvancedMemberStrategy implements MemberStrategy{ 6 7 @Override 8 public double discount(double booksPrice) { 9 10 System.out.println("對於高級會員的折扣為20%"); 11 return booksPrice * 0.8; 12 } 13 14 } 15 package strategy; 16 /* 17 * 具體策略角色:中級會員 18 */ 19 20 public class IntermediateMemberStrategy implements MemberStrategy { 21 22 @Override 23 public double discount(double booksPrice) { 24 25 System.out.println("中級會員的折扣:10%"); 26 return booksPrice * 0.9; } 27 28 } 29 package strategy; 30 /* 31 * 抽象策略 32 */ 33 public interface MemberStrategy { 34 35 public double discount(double booksPrice); 36 37 } 38 package strategy; 39 /* 40 * 實體類 41 */ 42 public class OnlinePrice extends Price { 43 44 @Override 45 public void show() { 46 System.out.println("OnlinePrice"); 47 48 } 49 50 } 51 package strategy; 52 /* 53 * 抽象類 54 * 目的:抽取相似代碼,減少冗余 55 */ 56 public abstract class Price { 57 private MemberStrategy strategy; 58 59 public MemberStrategy getStrategy() { 60 return strategy; 61 } 62 /* 63 * 提供setter方法可以動態調節折扣類型 64 */ 65 public void setStrategy(MemberStrategy strategy) { 66 this.strategy = strategy; 67 } 68 public double discountedPrice(double booksPrice){ 69 return this.strategy.discount(booksPrice); 70 } 71 public abstract void show(); 72 73 } 74 package strategy; 75 /* 76 * 具體策略角色:初級會員 77 */ 78 79 public class PrimaryMemberStrategy implements MemberStrategy { 80 81 @Override 82 public double discount(double booksPrice) { 83 System.out.println("初級會員沒有折扣"); 84 return booksPrice; 85 } 86 87 } 88 package strategy; 89 /* 90 * 實體類 91 */ 92 public class StorePrice extends Price { 93 94 @Override 95 public void show() { 96 System.out.print("StorePrice"); 97 98 } 99 100 } 101 package strategy; 102 /* 103 * 測試類 104 */ 105 public class Test { 106 public static void main(String[] args) { 107 Price price=new OnlinePrice(); 108 price.setStrategy(new PrimaryMemberStrategy()); 109 price.show(); 110 System.out.println("打折后價格:"+price.discountedPrice(1000)); 111 } 112 }
網上看到的關於策略模式的介紹:
策略(Strategy)模式:又名Policy,它的用意是定義一組算法,把它們一個個封裝起來,並且使他們可以相互替換。策略模式可以獨立於使用他們的客戶端而變化。GOF策略模式靜態結構類圖如下:
通過上圖可以看出策略模式有以下角色構成:
1、抽象策略(Strategy)角色:抽象策略角色由抽象類或接口來承擔,它給出具體策略角色需要實現的接口;
2、具體策略(ConcreteStrategy)角色:實現封裝了具體的算法或行為;
3、場景(Context)角色:持有抽象策略類的引用。
策略模式重點是封裝不同的算法和行為,不同的場景下可以相互替換。策略模式是開閉原則的體現,開閉原則講的是一個軟件實體應該對擴展開放對修改關閉。策略模式在新的策略增加時,不會影響其他類的修改,增加了擴展性,也就是對擴展是開放的;對於場景來說,只依賴於抽象,而不依賴於具體實現,所以對修改是關閉的。
使用場景
假設現在要設計一個販賣各類書籍的電子商務網站的購物車系統。一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這要復雜。比如,本網站可能對所有的高級會員提供每本20%的促銷折扣;對中級會員提供每本10%的促銷折扣;對初級會員沒有折扣。
根據描述,折扣是根據以下的幾個算法中的一個進行的:
算法一:對初級會員沒有折扣。
算法二:對中級會員提供10%的促銷折扣。
算法三:對高級會員提供20%的促銷折扣。
如果僅僅實現上述需求,可以能略簡單,現在再加一個條件:會員購買方式可能為網購或實體店購買,需要展示購買方式。
原則:考慮到以后可能會有其它打折策略(出現個至尊VIP),所以我們要讓代碼好維護,這就要求我們要面向接口編程,而不是面向實現編程。
為了減少代碼冗余,固定的代碼就要抽取封裝。
少用繼承,多用組合。
提供setter方法可以保證對象的封裝性,
運行結果: