<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java設計模式學習記錄-策略模式

      策略模式

      策略模式的定義是:定義了一系列的算法,把它們一個個的封裝起來,并且使它們可相互替換,讓算法可以獨立于使用它的客戶而變化。

      設計原則是:把一個類中經常改變或者將來可能會經常改變的部分提取出來作為一個接口,然后在使用類中包含這個接口的實例,這樣使用類的對象就可以隨意調用實現了這個接口的類行為。

      在策略模式中有如下幾個角色:

      環境角色(Context): 此角色中實現了對策略角色的引用和使用。

      抽象策略角色:此角色通常由抽象類或接口來實現,定義了,所以具體策略角色的行為。

      具體策略角色:此角色封裝了實現不同功能的不同算法。

      演示代碼如下:

      抽象策略類

      public interface Strategy {
          /**
           * 策略方法
           */
          void strategyMethod();
      }

      具體角色類A

      public class ConcreteStrategyA implements Strategy{
      
          @Override
          public void strategyMethod() {
              //具體的行為
          }
      }

      具體角色類B

      public class ConcreteStrategyB implements Strategy {
          @Override
          public void strategyMethod() {
              //具體的行為
          }
      }

      環境角色類

      public class Context {
          /**
           * 持有一個具體的策略對象
           */
          private Strategy strategy;
      
          /**
           * 構造方法,傳入一個具體的策略對象
           * @param strategy 具體的策略對象
           */
          public Context(Strategy strategy)
          {
              this.strategy = strategy;
          }
      
          /**
           * 對外提供的使用策略的方法
           */
          public void contextMethod()
          {
              //通常會轉調具體的策略對象進行算法運算
              strategy.strategyMethod();
          }
      }

      策略模式具體場景例子

      某Saas公司的企業服務系統,在銷售時,會根據客戶的購買時長來確定優惠策略,分為普通客戶(無優惠政策),大客戶(98折),戰略客戶(95折)。普通客戶是指一次性租用服務在一到3年之間的,大客戶指一次性使用服務3到5年之間的,戰略客戶指一次性使用服務5年以上的。因為每種客戶價格算法不同,所以這個場景就可以使用策略模式。

      定義一個計算價格行為的接口

      public interface SalePrice {
          /**
           * 根據原價返回不同的價格
           * @param originalPrice 原始價格
           * @return
           */
          BigDecimal salePrice(BigDecimal originalPrice);
      }

      然后定義三中客戶的具體計算價格類(策略類)

      public class OriginalCustomer implements SalePrice {
          /**
           * 普通客戶直接返回原價
           * @param originalPrice 原始價格
           * @return 計算后的價格
           */
          @Override
          public BigDecimal salePrice(BigDecimal originalPrice) {
      
              return originalPrice.multiply(BigDecimal.valueOf(1));
          }
      }

       

      public class LargeCustomer implements SalePrice {
          /**
           * 大客戶返回98折價格
           * @param originalPrice 原始價格
           * @return 計算后的價格
           */
          @Override
          public BigDecimal salePrice(BigDecimal originalPrice) {
      
              return originalPrice.multiply(BigDecimal.valueOf(0.98));
          }
      }
      public class StrategicCustomer implements SalePrice {
          /**
           * 戰略客戶直接返回95折價格
           * @param originalPrice 原始價格
           * @return 計算后的價格
           */
          @Override
          public BigDecimal salePrice(BigDecimal originalPrice) {
              return originalPrice.multiply(BigDecimal.valueOf(0.95));
          }
      }

      客戶類,需要判斷具體的調用哪個計算價格的方法

      public class Customer {
      
          private int years;
          /** 租用服務一年的初始價格 */
          private BigDecimal originalPrice = BigDecimal.valueOf(50000);
          /** 客戶最終支付的價格 **/
          private BigDecimal payForPrice = BigDecimal.ZERO;
          /** 每個客戶的初始價格都是原價 */
          private SalePrice salePrice = new OriginalCustomer();
      
          /**
           * 根據客戶購買的時長來計算每一年的優惠價格(單位:年)
           * @param years
           */
          public void buy(int years)
          {
              this.years = years;
              payForPrice = originalPrice.multiply(BigDecimal.valueOf(years));
              //大于5年的戰略客戶價格
              if(years >= 5){
                  salePrice = new StrategicCustomer();
              }else if(years >= 3)//3年到5年的大客戶優惠價格
              {
                  salePrice = new LargeCustomer();
              }else if(years >= 1)//1到3年的普通用戶原價
              {
                  salePrice = new OriginalCustomer();
              }
          }
      
          /**
           * 計算客戶最終支付的價格
           * @return
           */
          public BigDecimal payPrice(){
              return salePrice.salePrice(payForPrice);
          }
      
      }

      客戶端調用類,自動計算支付價格

      **
       * 客戶端調用類
       */
      @Slf4j
      public class Client {
      
          public static void main(String[] args){
              Customer customer = new Customer();
      
              customer.buy(1);
              log.info("客戶需支付:{}",customer.payPrice());
      
              customer.buy(3);
              log.info("客戶需支付:{}",customer.payPrice());
      
              customer.buy(6);
              log.info("客戶需支付:{}",customer.payPrice());
      
          }
      }

      輸出結果:

      客戶需支付:50000
      客戶需支付:147000.00
      客戶需支付:285000.00

      根據輸出結果可以看出購買不同時間的服務,收費價格是不同的。這樣客戶可以不用依賴具體的收費方法,直接根據需要的服務的時間購買即可。

       

      posted @ 2018-05-06 17:53  紀莫  閱讀(760)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲国产精品线观看不卡| 日韩卡一卡2卡3卡4卡| 99riav精品免费视频观看| 精品国产午夜福利在线观看| 黑人巨大精品欧美一区二区| 中文字幕精品无码一区二区| 亚洲 丝袜 另类 校园 欧美| 日韩精品国产精品十八禁| 国产精品天干天干综合网| 日本一区二区三区视频版| 精品人妻中文字幕av| 亚洲欧美综合在线天堂| 一区二区三区久久精品国产| 99久久精品久久久久久婷婷| 久久综合激情网| 女人扒开腿让男人桶到爽| 国产精品成人午夜久久| 日韩精品av一区二区三区| 成人无套少萝内射中出| 亚洲精品国产第一区二区| 国产精品va在线观看无码不卡| 欧美黑人巨大videos精品| 怀宁县| 十八禁日本一区二区三区| 国产午夜亚洲精品国产成人| 久久五十路丰满熟女中出| 国产伦人人人人人人性| 成人亚欧欧美激情在线观看| 中文字幕日韩精品东京热| 我国产码在线观看av哈哈哈网站| 午夜成人无码免费看网站| 日本一区二区三本视频在线观看| 亚洲国产色一区二区三区| 亚洲精品自拍视频在线看| 久久人人爽人人爽人人片| 国产一区二区三区亚洲精品 | 亚洲成人av一区二区| 国产午夜精品福利91| 久久综合久中文字幕青草| 亚洲中少妇久久中文字幕| 中文字幕日韩熟女av|