JavaScript設計模式—策略模式
策略模式
策略模式指的是定義一些列的演算法,把他們一個個封裝起來,目的就是將演算法的使用與演算法的實現分離開來。說白了就是以前要很多判斷的寫法,現在把判斷裡面的內容抽離開來,變成一個個小的個體。
表單校驗為例:
<form action="http:// xxx.com/register" id="registerForm" method="post"> 請輸入使用者名稱:<input type="text" name="userName" /> 請輸入密碼:<input type="text" name="password"/> 請輸入手機號:<input type="text" name="phoneNumber" /> <button>提交</button> </form>
常見的程式碼編寫方式:
var registerForm = document.getElementById('registerForm'); registerForm.onsubmit = function(){ if (registerForm.userName.value == '') { alert('使用者名稱不能為空'); return false; } if (registerForm.password.value.length < 6) { alert('密碼長度不能少於6位'); return false; } if (!/(^1[3|5|8][0-9]{9}$)/.test(registerForm.phoneNumber.value)) { alert('手機號格式不正確'); return false; } }
策略模式:
這個模式涉及到三個角色:
- 具體策略(ConcreteStrategy)角色:包裝了相關的演算法或行為。
- 抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或抽象類實現。此角色給出所有的具體策略類所需的介面。
- 環境(Context)角色:持有一個Strategy的引用。
第一步封裝策略物件(演算法):
var strategies = { isNonEmpty:function(value,errorMsg){ //不為空 if (value === '') { return errorMsg; } }, minLength:function(value,length,errorMsg){ //限制最小長度 if (value.length < length) { return errorMsg; } }, isMobile:function(value,errorMsg){ //手機號格式 if (!/(^1[3|5|8][0-9]{9}$).test(value)) { return errorMsg; } } }
第二步封裝抽象類(介面):
var Validator = function(){
this.cache = []; //儲存校驗規則
}
Validator.prototype.add = function(dom,rule,errorMsg){
var ary = rule.split(':'); //把strategy和引數分開
this.cache.push(function(){ //把校驗的步驟都用空函式包裝起來,並且放入cache
var strategy = ary.shift(); //使用者挑選的strategy
ary.unshift(dom.value); //把input的value新增進引數列表
ary.push(errorMsg); //把errorMsg新增進引數列表
return strategies[strategy].apply(dom,ary);
})
}
Validator.prototype.start = function(){
for (var i = 0,validatorFunc;validatorFunc = this.cache[i++];) {
var msg = validatorFunc(); //開始校驗,並取得校驗後的返回資訊
if(msg){ //如果有確切的返回值,說明校驗沒有通過
return msg;
}
}
}
第三步策略的實現(引用):
var validataFunc = function(){
var validator = new Validator(); //建立一個validator類
/*******************新增一些校驗規則*********************/
validator.add(registerForm.userName,'isNonEmpty','使用者名稱不能為空');
validator.add(registerForm.password,'minLength:6','密碼長度不能少於6位');
validator.add(registerForm.phoneNumber,'isMobile','手機號碼格式不正確');
var errorMsg = validator.start(); //獲得校驗結果
return errorMsg; //返回校驗結果
}
var registerForm = document.getElementById('registerForm');
registerForm.onsubmit = function(){
var errorMsg = validataFunc(); //如果errorMsg有確切的返回值,說明未通過校驗
if(errorMsg){
alert(errorMsg);
return false; //阻止表單提交
}
}
相關推薦
JavaScript設計模式—策略模式
策略模式策略模式指的是定義一些列的演算法,把他們一個個封裝起來,目的就是將演算法的使用與演算法的實現分離開來。說白了就是以前要很多判斷的寫法,現在把判斷裡面的內容抽離開來,變成一個個小的個體。表單校驗為
JavaScript設計模式——策略模式
javaScript設計模式——策略模式 策略模式(Strategy):將定義的一組演算法封裝起來,使其相互之間可以替換。封裝的演算法具有一定獨立性,不會隨客戶端變化而變化。 商品促銷問題 問題描述:超時年底促銷,部分商品5折銷售,部分9
PHP設計模式-策略模式
行為 一個 文件 ech 策略 something protected this cte <?php//策略模式//將一組特定的算法或行為 封裝成一個類,以適應上下文環境//策略的接口文件 約定策略的行為 針對一種情況 產生具體的策略interface Policy
設計模式——策略模式
contex mas bob listbox inf items 收銀系統 setter .com 聲明:以下內容來源於《大話設計模式》,學習。 策略模式:定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。 商場收費策略:正
設計模式策略模式
onclick sea func cal sdn 不同的 memory hide http 參考http://blog.csdn.net/calmreason/article/details/51029285 定義一系列相同的算法 根據不同需求選擇不同的算法策略 代碼
C++設計模式——策略模式
code spa fine 技術分享 pin ati first virtual headfirst 模式定義:策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。 舉個例子來説,不同鴨子的行爲是不同的,我們可以把變化的行爲提
Java 設計模式—策略模式
ember edm 等級 dia span private edi concrete tin 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述策略(Strategy)模式的: 策略模式屬於對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的
設計模式之——淺談strategy模式(策略模式)
兩個 事情 操作 none 要去 編碼 淺談 一點 進行 strategy模式,即策略模式。個人覺得吧,策略模式更多的是一種思維方式。 首先我們要知道,為什麽需要策略模式。舉個例子,比如用程序輸出今天下午去玩什麽。 PlayGame 玩遊戲 package site.wa
設計模式---策略模式
不同的 ext 減少 交互 運行時 系列 使用 增加 策略 策略模式:它定義算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。 Context(應用場景): 1. 需要使用ConcreteStrategy提供的算法。 2. 內部
(轉)設計模式——策略模式
提高 {} xiang 有一個 ble 問題 其它 add 新的 轉載地址:http://blog.csdn.net/lifuxiangcaohui/article/details/8065059 這篇文章講述的策略模式非常棒,在此轉載。 設計模式; 一個程序員對設計模
Python設計模式——策略模式(孫悟空用什麽打妖怪)
就是 作用 oop 事情 input 邏輯控制 except exce one #coding:utf-8 ''' 策略模式作用: 就是使用多種算法來解決一個問題,最大的特性的是:能夠在運行時透明地切換算法(客戶端代碼對變化無感知)
C# - 設計模式 - 策略模式
變化 繼承 否則 www. 默認 ref 獨立 UNC int 策略模式 問題場景 多個類型都有一些共同的屬性和方法,可以稱這些成員為行為,為了避免重復在多個類型中編碼相同部分的行為,應考慮將這些行為定義在抽象類(超類)中,利用繼承時多個類型可以共享這些行為。比如定義一
Java設計模式----------策略模式
用戶 無法 提交 main 遊戲 抽象 可能 測試類 ide 以下內容來自HeadFIrst設計模式一書和http://www.cnblogs.com/xrq730/p/4906313.html的博文,作為自己的學習筆記總結如下。 HeadFirst設計模式一書在開篇就
設計模式-策略模式
設計模式 策略模式 public abstract class baseClass { public abstract double getResult(double num1,double num2); } public class A:baseClass { pub
PHP設計模式 -- 策略模式
所有 約定 IT 傳統 else emc 區別 ima TP 策略模式: 6、將一組特定的行為和算法封裝成類,以適應某些特定的上下文環境。 1、 多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。 2、 需要在
java設計模式-策略模式
temp return private 數組排序 寫法 冒泡 有一種 eth RF 背景:將一個數組排序,並且打印; 1.下面使用選擇排序、和冒泡排序來寫: public class Test { public
設計模式-策略模式(strategy pattern)
pre rac uml類圖 獨立 CA 使用 dep () nes 來說說設計模式吧,最近開始看設計模式,覺得挺有意思的。設計模式網上的資料的挺多的,而且大部分是大家相互轉來轉去的。感覺也挺沒有意思。我就自己寫一點吧! 開始 學習設計模式,我
Java常用設計模式——策略模式
nts static 管理 選擇 span disco rri contex 由於 策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換,策略模式讓算法獨立於使用它的客戶而獨立變化。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化
JavaScript形而上的策略模式
定義 table ava 使用 amd 簡潔 prop 相互 並且 什麽是策略模式? 先看代碼片段1。 // 代碼片段1 var bonus = new Bonus(); bonus.setSalary(10000); bonus.setStrategy(new perfo
HeadFirst設計模式---策略模式 C#實現
模式 adf oid info wing face rmq protected src 鴨子基類 將行為封裝起來 class Duck { protected IFlyBehavior flyBehavior; protec