【デザインモードシリーズ】の【ディエゼルモード】

14165 ワード

前書き:コードのレベルを上げるには、デザインモードを避けられません.前にもいくつかの理解がありましたが、深く勉強していません.最近はシステムの勉強をして、デザインを高めて、結合する能力を高めて、いい本を見つけました.
ローズマリーモード
  • 定義と紹介
  • 内部ローズマリー
  • JavaScriptにおけるローズマリーモード
  • ディショナーモードの例
  • 定義と紹介
    ディケンサモードとは、統合されたオブジェクトのそれぞれの要素に順次アクセスする方法を提供し、オブジェクトの内部表現を露出する必要がないことを意味する.
    ディケンサモードは、反復のプロセスをトラヒックロジックから分離し、ディケンサモードを使用した後、対象の内部構造に関心がなくても、その中の各要素に順番にアクセスすることができます.
    ローズマリーモードは比較的シンプルなデザインモデルで、多くの時にはデザインモードとは思えません.今はほとんどの言語にローズマリーが内蔵されています.
    現代語には、jsのArray.prototype.forEachなどのローズマリーが内蔵されています.私達も自分で一つのローズマリーを実現できます.
    const each = (arr, cb) {
    	for(let i=0; i<arr.length; i++){
    		cb.call(arr[i], i, arr[i]);
    	}
    }
    
    内部ローズマリーと外部ローズマリー
    私たちがjsでよく使うforEachは内部ローズマリーであり、その内部で反復規則が定義されています.彼は反復プロセス全体を完全に引き継ぎます.外部は最初の呼び出しだけが必要です.
    一方、外部のローズマリーは次の要素を明示的に要求し反復しなければならない.たとえば:
    const Iterator = function(arr) {
    	const current = 0;
    	const next = function(){
    		current += 1;
    	}
    	const isDone = function(){
    		return current >= arr.length;
    	}
    	const getCurrentItem = function(){
    		return arr[current];
    	}
    	return {
    		next,
    		isDone,
    		getCurrentItem,
    	}
    }
    
    //    ,  
    Iterator.isDone() //        
    Iterator.next() //          
    Iterator.getCurrentItem() //     
    
    JavaScriptのローズマリーモードArray.prototype.forEachローズマリーモードの例
    前のコードには、ファイルをアップロードする際に、ブラウザによって該当するアップロードコンポーネントオブジェクトを取得する必要があると仮定します.
    
    //      
    const getUploadObj = function() {
    	try{
    		return new ActiveXObject('TXFTNActive.FTNUpload'); // IE    
    	} cache(e) {
    		if(supportFlash()){ //     flash
    			const str = '';
    			return $(str).appendTo($('body'));
    		} else {
    			const str = ''; //     
    			return $(str).appendTo($('body'));
    		}
    	}
    }
     
      

    , , , if else , 。

    , , , , false, 。 , , , false。 。

    // IE    
    const getActiveUpoladObj = function() {
    	try{
    		return new ActiveXObject('TXFTNActive.FTNUpload');
    	} cache(e) {
    		return false;
    	}
    }
    // flash  
    const getFlashUpoladObj = function() {
    	const str = '';
    	return $(str).appendTo($('body'));
    }
    //     
    const getFormUpoladObj = function() {
    	const str = '';
    			return $(str).appendTo($('body'));
    }
    
    //    
    const iteratorUploadObj = function() {
    	for(let i=0; i<arguments.length; i++) {
    		let uploadObj = fn();
    		if(uploadObj !== false) {
    			return uploadObj;
    		}
    	}
    }
    
    //   
    const uploadObj = iteratorUploadObj(getActiveUpoladObj, getFlashUpoladObj, getFormUpoladObj);