1. <bdo id="8zfej"></bdo>
    <li id="8zfej"><meter id="8zfej"><th id="8zfej"></th></meter></li>

    南京中博教育

    全國咨詢電話:15195455103

    三分鐘了解中博教育
    當前位置:南京中博教育 > 學習園地 > 編程技巧

    策略模式

    來源:南京中博教育張府園校區? ? ? 作者:IT教育 ? ??

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

    定義

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

    UML
     

    中博教育軟件學校職業教育

    實現

    Strategy.java,策略類,定義算法的公共接口。
    public abstract class Strategy {
       // 算法方法
       public abstract void algorithmInterface();
    }
     
    ConcreteStrategyA.java,算法A,封裝了具體算法,繼承Strategy。
    public class ConcreteStrategyA extends Strategy {
       @Override
       public void algorithmInterface() {
          System.out.println("算法A實現");
       }
    }
     
    ConcreteStrategyB.java,算法B。
    public class ConcreteStrategyB extends Strategy {
       @Override
       public void algorithmInterface() {
          System.out.println("算法B實現");
       }
    }
     
    ConcreteStrategyC.java,算法C。
    public class ConcreteStrategyC extends Strategy {
       @Override
       public void algorithmInterface() {
          System.out.println("算法C實現");
       }
    }
     
    Context.java,上下文環境,維護Strategy引用。
    public class Context {
       private Strategystrategy;
       public Context(Strategy strategy) {
          this.strategy = strategy;
       }
       public void contextInterface() {
          strategy.algorithmInterface();
       }
    }
     
    StrategyTest.java,客戶端代碼。
    public class StrategyTest {
       public static void main(String[] args) {
          Context context;
          context = new Context(new ConcreteStrategyA());
          context.contextInterface();
          context = new Context(new ConcreteStrategyB());
          context.contextInterface();
          context = new Context(new ConcreteStrategyC());
          context.contextInterface();
       }
    }

    優缺點
    優點
    1、   提供了一種替代繼承的方法,而且既保持了繼承的優點(代碼重用),還比繼承更靈活(算法獨立,可以任意擴展);
    2、   避免程序中使用多重條件轉移語句,使系統更靈活,并易于擴展;
    3、   遵守大部分GRASP原則和常用設計原則,高內聚、低偶合;
    4、   易于進行單元測試,各個算法區分開,可以針對每個算法進行單元測試;
    5、   ……
    缺點
    1、   因為每個具體策略類都會產生一個新類,所以會增加系統需要維護的類的數量;
    2、   選擇何種算法需要客戶端來創建對象,增加了耦合,這里可以通過與工廠模式結合解決該問題;
    3、   程序復雜化。
    實例
    需求
    商場收銀系統,實現對不同情況(正常收費、折扣收費、返利收費等)的收費。
    實現
    CashSuper.java,現金收費父類。
    /* 現金收費父類 */
    public abstract class CashSuper {
       /* 收取現金方法,參數為商品原價,返回值為當前價 */
       public abstract double acceptCash(double money);
    }
     
    CashNormal.java,正常收費。
    /* 正常收費 */
    public class CashNormal extends CashSuper {
       @Override
       public double acceptCash(double money) {
          return money;
       }
    }
     
    CashRebate.java,打折收費。
     
    /* 打折收費 */
    public class CashRebate extends CashSuper {
       /* 折扣率 */
       private double moneyRebate;
      
       public CashRebate(double moneyRebate) {
          this.moneyRebate = moneyRebate;
       }
     
       @Override
       public double acceptCash(double money) {
          return money *moneyRebate;
       }
    }
     
     
    CashReturn.java,返利收費。
    /* 返利收費 */
    public class CashReturn extends CashSuper {
       /* 返利滿足條件 */
       private double moneyCondition;
       /* 滿足條件后返回值 */
       private double moneyReturn;
      
       public CashReturn(double moneyCondition,double moneyReturn) {
          this.moneyCondition = moneyCondition;
          this.moneyReturn = moneyReturn;
       }
     
       @Override
       public double acceptCash(double money) {
          double result = 0;
          result = money - Math.floor(money / moneyCondition) * moneyReturn;
          return result;
       }
    }
     
    CashContext.java,維護CashSuper對象。
    public class CashContext {
     
       private CashSupercs;
      
       public CashContext(CashSuper cs) {
          this.cs = cs;
       }
      
       public double getResult(double money) {
          return cs.acceptCash(money);
       }
    }
     
    CashTest.java,客戶端。
    public class CashTest {
       public static void main(String[] args) {
          double money = 500;
          CashContext context;
          context = new CashContext(new CashNormal());
          double normal = context.getResult(money);
          System.out.println("正常收費:" + normal);
          context = new CashContext(new CashRebate(0.8));
          double rebate = context.getResult(money);
          System.out.println("八折收費:" + rebate);
          context = new CashContext(new CashReturn(200, 100));
          double retur = context.getResult(money);
          System.out.println("滿200返100:" + retur);
       }
    }
    總結

    策略模式和簡單工廠模式的區別

    相同點
    1、   都是用到了封裝、繼承、多態;
    2、   都抽出一個接口或者抽象類,針對不同的情況,有不同的實現類。
    不同點
    1、   使用方式不同,工廠是靜態的,策略的上下文是需要創建對象的;
    2、   工廠產生的是對象,不同情況下產生不同的對象;
    3、   策略產生的是策略,或者說是算法,不同情況下使用不同的算法。
    結論
    無論何種設計模式,都是基于面相對象的三大特性,即封裝、繼承、多態。

     


    分享到:

    相關閱讀:

    近期文章

    搶試聽名額

    名額僅剩66名

    教育改變生活

    WE CHANGE LIVES

    主站蜘蛛池模板: 狠狠久久综合伊人不卡| 婷婷成人丁香五月综合激情| 五月天激激婷婷大综合丁香| 狠狠色丁香婷婷久久综合不卡| 伊人久久亚洲综合影院| 中文字幕亚洲综合久久男男| 亚洲综合网站色欲色欲| 激情综合婷婷丁香五月俺来也| 色天天天综合色天天碰| 亚洲AV综合色区无码二区爱AV| 日本久久综合久久综合| 久久久久AV综合网成人| 一本一本久久a久久精品综合| 久久综合综合久久综合| 激情综合婷婷丁香五月蜜桃 | 久久综合亚洲色hezyo| 国产香蕉尹人综合在线观看| 婷婷综合另类小说色区| 久久久久久青草大香综合精品| 亚洲综合另类小说色区| 亚洲伊人久久综合影院| 亚洲欧美日韩综合俺去了| 天天久久影视色香综合网| 狠色狠色狠狠色综合久久| 伊人一伊人色综合网| 国产成人精品综合在线观看| 香蕉综合在线视频91| 色综合91久久精品中文字幕| 色综合久久天天影视网| 狼狼综合久久久久综合网| 开心五月激情综合婷婷| 91综合久久婷婷久久| 亚洲小说图区综合在线| 婷婷综合久久狠狠色99H| 亚洲日韩在线中文字幕综合 | 色老头综合免费视频| 色综合合久久天天给综看| 日韩字幕一中文在线综合| 五月天激情综合网丁香婷婷| 婷婷丁香五月天综合东京热| 狠狠色成人综合网图片区|