java—設計模式_策略模式


 

 

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方法可以保證對象的封裝性,

    

運行結果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM