1. 程式人生 > >JavaScript設計模式—策略模式

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