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| 综合91在线精品| 日韩人妻无码一区二区三区综合部| 亚洲色婷婷综合久久| 97久久久精品综合88久久 | 狼狼综合久久久久综合网| 亚洲成AV人综合在线观看| 狠狠色噜狠狠狠狠色综合久| 亚洲国产成人久久综合一区77| 色婷婷综合久久久久中文一区二区 | 亚洲AV综合色区无码一区爱AV| 色欲色香天天天综合网站| 一本久久a久久精品综合香蕉| 亚洲婷婷综合色高清在线| 一本久到久久亚洲综合| 色综合色综合色综合色综合网 | 区三区激情福利综合中文字幕在线一区 | 色婷婷六月亚洲综合香蕉| 人人狠狠综合久久亚洲88| av一本久道久久综合久久鬼色| 色狠狠色狠狠综合一区| 久久婷婷五月综合色奶水99啪| 综合亚洲伊人午夜网| 午夜激情影院综合| 亚洲综合小说久久另类区| 久久久综合九色合综国产精品 | 亚洲色婷婷综合开心网| 国产亚洲综合视频| 国产亚洲Av综合人人澡精品| 天天干天天色综合| 色婷婷狠狠久久综合五月| 亚洲国产综合精品中文第一| 丁香婷婷亚洲六月综合色| 亚洲综合精品伊人久久| 狠狠色综合一区二区| 亚洲欧美国产国产综合一区| 狠狠色狠狠色综合系列| 六月婷婷激情综合| 激情综合婷婷丁香五月蜜桃|