国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

策略模式,一種廣泛應用于各種情況的設計模式(設計模式與開發(fā)實踐 P5)

這篇具有很好參考價值的文章主要介紹了策略模式,一種廣泛應用于各種情況的設計模式(設計模式與開發(fā)實踐 P5)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

策略模式

定義:定義一系列算法,把它們一個個封裝起來,并且可以互相替換

例如,我們要計算年終獎,年終獎根據績效 A、B、C 來計算最終數值

實現

最初我們很容易想到用 分支 if 來解決這個問題,如果績效 = A 則工資 x 2,如果績效 = B 則工資 x 3

如果經常使用這樣的分支結構,你會發(fā)現代碼耦合度很高,很容易就出現一大坨代碼堆砌在一起,只是 x 2 或者 x 3 不足以形成難以維護的結構,但如果不是 x 2 而是一個復雜的代碼塊,我們顯然會想到封裝里面的代碼!

var performA = function (salary) {
  return salary * 4;
};

var performB = function (salary) {
  return salary * 3;
};

var performC = function (salary) {
  return salary * 2;
};

var calcBonus = function (level, salary) {
  if (level == "A") {
    return performA(salary);
  } else if (level == "B") {
    return performB(salary);
  } else if (level == "C") {
    return performC(salary);
  }
};

是的,雖然我們優(yōu)化了代碼,但沒好到哪去,如果要添加一個 D 級,我們還是得堆砌代碼

讓我們來看看策略模式怎么做吧,策略模式讓 策略 被定義和封裝,且可以相互替換

這就是最終代碼了,但在 javascript 中實現策略相較 C# 或者其他語言來說要容易的多,在下面舉例了 C# 代碼

var strategies = {
  A: function (salary) {
    return salary * 4;
  },
  B: function (salary) {
    return salary * 3;
  },
  C: function (salary) {
    return salary * 2;
  },
};

var calculateBonus = function (level, salary) {
  return strategies[level](salary);
};

需要注意的是 strategies 對象存儲的 3 個匿名函數, Func 類是用來存儲函數的,需要一定的函數工具類基礎

掌握這樣的思想以后,試著把 {"A", (salary) => salary * 4} 解耦出去動態(tài)添加即可~

using System;
using System.Collections.Generic;

public class Program
{
    private static Dictionary<string, Func<double, double>> strategies = new Dictionary<string, Func<double, double>>()
    {
        {"A", (salary) => salary * 4},
        {"B", (salary) => salary * 3},
        {"C", (salary) => salary * 2}
    };

    private static double CalculateBonus(string level, double salary)
    {
        return strategies[level](salary);
    }

    public static void Main(string[] args)
    {
        string level = "A";
        double salary = 1000;

        double bonus = CalculateBonus(level, salary);
        Console.WriteLine("Bonus: " + bonus);
    }
}

思想

通過上面的重構:

  • 消除了大片的分支語句
  • 計算獎金的邏輯不再存儲在 CalculateBonus 里了,而是分布在策略對象里
  • 策略對象只負責計算獎金
  • 策略對象之間可以相互替換

實戰(zhàn) - 表單

這是一種尤為常見的表單驗證方式,相信絕大多數前端程序員這樣寫過

顯然能發(fā)現,這里的 if 堆砌過多,不僅如此,內部的 邏輯 相比上面的代碼也更復雜

var registerForm = function (form) {
  if (form.username.value === "") {
    alert("用戶名不能為空");
    return false;
  }

  if (form.password.value.length < 6) {
    alert("密碼長度不能少于6位");
    return false;
  }

  if (!/(^1[3|5|8][0-9]{9}$)/.test(form.phoneNumber.value)) {
    alert("手機號碼格式不正確");
    return false;
  }
};

我們可以用策略模式的思路來實現類似這樣的代碼,這樣當我們需要增加驗證步驟時,只需要添加策略內容即可:文章來源地址http://www.zghlxwxcb.cn/news/detail-732574.html

var validateStrategy = {
  isNotEmpty: function (form) {
    if (form.name === "") {
      return "用戶名不能為空";
    }
    return "";
  },
  minLength: function (form) {
    if (form.password.length < 6) {
      return "密碼長度不能少于6位";
    }
    return "";
  },
  isMobile: function (form) {
    if (!/(^1[3|5|8][0-9]{9}$)/.test(form.phone)) {
      return "手機號碼格式不正確";
    }
    return "";
  },
};

var validate = function (form) {
  for (let func in validateStrategy) {
    if (
      validateStrategy.hasOwnProperty(func) &&
      typeof validateStrategy[func] === "function"
    ) {
      var msg = validateStrategy[func](form);
      if (msg != "") return false;
    }
  }
  return true;
};

到了這里,關于策略模式,一種廣泛應用于各種情況的設計模式(設計模式與開發(fā)實踐 P5)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 設計模式的另一種有趣理解

    單例模式:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例單例模式。單例模式只應在有真正的“單一實例”的需求時才可使用。 俺有6個漂亮的老婆,她們的老公都是我,我就是我們家里的老公Sigleton,她們只要說道“老公”,都是指的同一

    2024年02月22日
    瀏覽(101)
  • [設計模式]行為型模式-策略模式

    策略模式定義了一系列算法,并將每個算法封裝起來,使它們可以互相替換,且算法的變換不會影響使用算法的客戶。 在項目開發(fā)中,我們經常要根據不同的場景,采取不同的措施,也就是不同的策略。假設我們需要對a、b這兩個整數進行計算,根據條件的不同,需要執(zhí)行不

    2024年02月19日
    瀏覽(32)
  • 設計模式什么情況下適合使用呢?

    很多情況下設計模式是一種經過驗證的解決特定問題的最佳實踐。設計模式提供了一種標準化的方式來解決常見的軟件設計問題,并提供了一種可重用的解決方案。設計模式可以幫助開發(fā)人員編寫具有高可維護性、可擴展性和可重用性的代碼。 設計模式適用于以下情況: 需

    2024年02月15日
    瀏覽(25)
  • 【設計模式】使用原型模式完成業(yè)務中“各種O”的轉換

    【設計模式】使用原型模式完成業(yè)務中“各種O”的轉換

    原型模式是一種非常簡單易懂的模型,在書上的定義是這樣的: Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype. 用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。 通俗的講,就是有一個現成的對象,我們通過復

    2024年02月07日
    瀏覽(18)
  • 設計模式之策略模式

    策略設計模式(Strategy Pattern)是一種行為設計模式,它允許在運行時選擇算法的行為。策略模式定義了一系列算法,并將每個算法封裝起來,使它們可以互相替換。這種模式使算法的變化獨立于使用算法的客戶端。 概念 在策略模式中,有以下幾個關鍵組成部分: 策略接口(

    2024年01月23日
    瀏覽(50)
  • 設計模式——策略模式

    設計模式——策略模式

    定義: 該模式定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。策略模式屬于對象行為模式,它通過對算法進行封裝,把便用算法的責任和算法的實現分割開來,并委派給不算法進象行管理。 主要角色如下: 示例: 假定現在需要

    2024年02月22日
    瀏覽(20)
  • 《設計模式》策略模式

    《設計模式》策略模式

    定義 : 又叫作 政策模式,將定義的一系列算法封裝起來,使得它們之間可以互相替換,從而讓算法的變化不影響到使用算法的用戶 。 屬于 行為型 模式。 策略模式的組成角色 : 環(huán)境類(Context) : 環(huán)境類是使用算法的角色 ,用來操作策略的上下文環(huán)境,屏蔽高層模塊(客戶

    2024年02月01日
    瀏覽(28)
  • 設計模式—策略模式

    設計模式—策略模式

    目錄 一、定義 二、特點 三、優(yōu)點 四、缺點 五、實例 六.涉及到的知識點 1、一個類里面有哪些東西? 2、類和實例 什么是類? 什么是實例? 什么是實例化? 3、字段和屬性 什么是字段? 屬性是什么? 屬性怎么用呢? 屬性有什么作用? 靜態(tài)屬性是什么? 屬性和字段的公有

    2024年02月10日
    瀏覽(23)
  • 【設計模式】4、策略模式

    【設計模式】4、策略模式

    策略模式是一種行為設計模式,它能定義一系列算法,把每種算法分別放入獨立的類中,以是算法的對象能相互替換。 一天, 你打算為游客們創(chuàng)建一款導游程序。 該程序的核心功能是提供美觀的地圖, 以幫助用戶在任何城市中快速定位。 用戶期待的程序新功能是自動路線

    2024年02月20日
    瀏覽(23)
  • 設計模式-策略模式

    策略模式是一種行為型設計模式,它允許在運行時動態(tài)改變對象的行為。在策略模式中,算法被封裝在獨立的策略類中,使得它們可以互換使用。下面是一個簡單的例子: 假設我們有一個計算稅收的系統(tǒng),現在需要計算不同類型的商品的稅收,例如書籍、食品和服裝。每種商

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包